目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
给我们一棵二叉树,问我们在这棵树里能找到的最长交错路径。最长交错路径就是在二叉树里一左一右一左一右这样走,最长能走的路径长度是多少。
这种二叉树类的题目我们是少不了递归遍历,这次递归我们需要携带参数去递归,就是记录我上一次是左拐还是右拐,然后每次遍历到新的节点我们都需要重新来以此节点作为路径的起始节点来递归。
例如我上一次在二叉树里是右拐,那么接下来我的递归,如果是左走的话,我就把记录路径长度的参数+1然后再次递归,并且还需要多一层递归,那就是路径长度从0开始重新计算的一层递归。
具体可以参考下面的代码。
代码:
class Solution {
public:
int res=0;
void digui(TreeNode* root,int flag,int temp){
if(root==nullptr){
res=max(res,temp);
return;
}
//使用flag来记录上一个是往左移还是往右移
if(flag==0){ //flag==0则表示上一次是往左移,因此接下来如果是右移的话就把记录的路径长度+1
digui(root->right,1,temp+1);
digui(root->left,0,0); //左移则表示从0开始左右交错,路径长度置0.
}else{
digui(root->left,0,temp+1);
digui(root->right,1,0);
}
}
int longestZigZag(TreeNode* root) {
if(root==nullptr) return 0;
digui(root->left,0,0);
digui(root->right,1,0);
return res;
}
};