题目描述:
给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:
选择二叉树中 任意 节点和一个方向(左或者右)。
如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
改变前进方向:左变右或者右变左。
重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。
思路:
递归回溯
定义dfs(当前节点,当前是左边还是右边,当前的最长交叉路径)
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int res=0;
//left->false,right->true
void dfs(TreeNode* rt,bool dir,int len){
res=max(res,len);
if(dir){
if(rt->left) dfs(rt->left,false,len+1);//如果dir==true,表示当前是右边,下一次是左边,符合交叉路径的条件,长度为len+1
if(rt->right) dfs(rt->right,true,1);//如果dir==true,表示当前是右边,下一次还是右边,不符合交叉路径的条件,长度变成1
}
else{
if(rt->right) dfs(rt->right,true,len+1);//如果dir==false,表示当前是左边,下一次是右边,符合交叉路径的条件,长度为len+1
if(rt->left) dfs(rt->left,false,1);//如果dir==false,表示当前是左边,下一次还是左边,不符合交叉路径的条件,长度变成1
}
}
int longestZigZag(TreeNode* root) {
if(!root) return 0;
dfs(root,false,0);//从根节点开始,有两个方向可以选择
dfs(root,true,0);
return res;
}
};
Python:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def longestZigZag(self, root: TreeNode) -> int:
res=0
def dfs(rt,dir,len):
if not rt:
return
nonlocal res
res=max(res,len)
if dir==True:
dfs(rt.left,False,len+1)
dfs(rt.right,True,1)
else:
dfs(rt.right,True,len+1)
dfs(rt.left,False,1)
dfs(root,False,0)
dfs(root,True,0)
return res