题目
原题链接
给你一棵以 root
为根的二叉树,二叉树中的交错路径定义如下:
- 选择二叉树中 任意 节点和一个方向(左或者右)。
- 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
- 改变前进方向:左变右或者右变左。
- 重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。
示例1:
输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
思路
首先,题目中的交错路径,我们直接理解为之字形路径
即可。
注 :在以下的表述中,一律不考虑 叶子节点 或 节点为空 的情况,代码中将体现
定义一个dfs()
函数,这个函数需要三个参数:
- 当前节点的指针,TreeNode*类型
- 上一步的方向;或者说,当前节点是父亲节点的左儿子还是右儿子,这个参数至关重要,左儿子用-1表示,右儿子用1表示
- 更新到了当前节点时,之字形路径的长度
每向儿子节点搜一步,都要面临两种选择:
- 转变一下方向:这时,函数的 第三个参数——路径的长度 要 +1
- 不转变方向,如:上一步向左走,这一步继续向左走,因为此时已经不满足之字形路径的定义了,所以,路径的的长度需要变为1,至于为什么是一不是零,接下来会说到。
现在思路已经很清晰了。另,我们还需定义一个全局变量,以存储不断被dfs()
函数更新的路径长度最大值,姑且叫它maxn
。
/**
* 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 maxn = 0; //定义存储最大值的全局变量
int longestZigZag(TreeNode* root) {
dfs(root -> left, -1, 1); //向左走是-1
dfs(root -> right, 1, 1); //向右走是1
//深度限定为1,就算没有办法走下去(也就是长度为0),下面的dfs函数第一句也就直接返回了
return maxn;
}
void dfs(TreeNode* root, int next, int deep) {
//看到没?三个参数!
if(!root) return ; //该节点为空直接返回
maxn = max(maxn, deep); //更新最大值
if(next == -1) { //上一步向左走
dfs(root -> left, -1, 1); //继续向左,归一
dfs(root -> right, 1, deep + 1); //改变方向,皆大欢喜
}
else { //上一步向右走
dfs(root -> left, -1, deep + 1); //改变方向,皆大欢喜
dfs(root -> right, 1, 1); //继续向右,归一
}
}
};