C++ 中二叉树的最长之字形路径
假设我们有一个二叉树根节点,二叉树的之字形路径定义如下:
在二叉树中选择任意一个节点和一个方向(向右或向左)。
如果当前方向是向右,则向当前节点的右子节点移动,否则向左子节点移动。
然后将方向从右更改为左,反之亦然。
重复第二步和第三步,直到我们无法在树中移动。
这里的之字形长度定义为访问的节点数减 1。(单个节点的长度为 0)。我们必须找到该树中包含的最长之字形路径。例如,如果树如下所示:

输出将为 3,因为 (右,左,右)
为了解决这个问题,我们将遵循以下步骤:
定义一个名为 dfs() 的方法,它将接收根节点和 leftB 作为参数
如果根节点为空,则返回 -1
如果根节点是树中唯一的节点,则返回 0
leftV := dfs(根节点的左子节点, true) 以及 rightV := dfs(根节点的右子节点, false)
ret := ret 和 (1 + leftV 和 rightV 的最大值) 的最大值
如果 leftB 不为 0,则返回 1 + rightV,否则返回 1 + leftV
在主方法中,设置 ret := 0
调用 dfs(根节点, true) 和 dfs(根节点, false)
返回 ret
示例(C++)
让我们看一下以下实现,以便更好地理解:
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = right = NULL;
}
};
void insert(TreeNode **root, int val){
queue<TreeNode*> q;
q.push(*root);
while(q.size()){
TreeNode *temp = q.front();
q.pop();
if(!temp->left){
if(val != NULL)
temp->left = new TreeNode(val);
else
temp->left = new TreeNode(0);
return;
} else {
q.push(temp->left);
}
if(!temp->right){
if(val != NULL)
temp->right = new TreeNode(val);
else
temp->right = new TreeNode(0);
return;
}else{
q.push(temp->right);
}
}
}
TreeNode *make_tree(vector<int> v){
TreeNode *root = new TreeNode(v[0]);
for(int i = 1; i<v.size(); i++){
insert(&root, v[i]);
}
return root;
}
class Solution {
public:
int ret;
int dfs(TreeNode* root, bool leftB){
if(!root) return -1;
if(!root->left && !root->right) return 0;
int leftV = dfs(root->left, true);
int rightV = dfs(root->right, false);
ret = max(ret, 1 + max(leftV, rightV));
if(leftB) return 1 + rightV;
return 1 + leftV;
}
int longestZigZag(TreeNode* root) {
ret = 0;
dfs(root, true);
dfs(root, false);
return ret;
}
};
main(){
vector<int> v = {1,NULL,1,1,1,NULL,NULL,1,1,NULL,1,NULL,NULL,NULL,1,NULL,1};
TreeNode *root = make_tree(v);
Solution ob;
cout << (ob.longestZigZag(root));
}输入
[1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出
3
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP