力扣1372.二叉树中最长交叉路径
自己总是能把简单的代码写的和石山一样,记录一下。
题目:
解答:
class Solution {
public:
int res = 0; // res为遍历的交叉节点最大数
void dfs(TreeNode* node, bool direction, int cnt) { //0左1右
if (node == nullptr) return;
res = max(res, cnt + 1) ;
if (!direction) { //下一步往左
dfs(node->left, 1, cnt + 1);
dfs(node->right, 0, 1); //下一步往右,cnt重置为1
}
else {
dfs(node->right, 0, cnt + 1);
if (node->left) dfs(node->left, 1, 1);
}
}
int longestZigZag(TreeNode* root) {
if (root == nullptr) return 0;
dfs(root, 0, 0); // 从根节点左子树出发
dfs(root, 1, 0);
return res - 1;
}
};
看到别人的题解,也可以先记录上一次是左边的父节点还是右边的,我的思路是每次判断下一次该遍历左节点还是右节点。
一开始写了一坨代码,没有把res = max(res, cnt + 1)
放在判定条件中,一直找不出错误,还是递归没有理解透彻,再多做做题吧…