1372. Longest ZigZag Path in a Binary Tree

Question请添加图片描述

思路

这道题的解法也是dfs, 但是要结合一下array, 就非常nb
首先题目要求我们要zigZag Path, 就是left -> right -> left -> right -> left
所以, 这个题的难点就在如何判断这个left right left right的顺序, 我们可以利用一个dfs的特性
就是dfs每次都是往left node/right node 往下走. 那么我们如果每次return 都return 一个array 来记录从当前node往左下走和往右下走的最长length, 在code中我们在稍微操作一下
让left return 回来的 去和它的往右下走的length 相加. 反之 right return 回来的加它的往左下走的length.
大概思路就是上述, 下面结合code解释解释
首先每个root return 一个array [left, right, result]
left = 从这个root往左边走能得到的最长zigZig path length
right = 从这个root 往右边走得到的最长zigzig path 的length
result = 这个node出发能得到的最长的zigzig path长度

所以当root == null 的时候 return [-1,-1,-1] 就是leaf node 的left 和 right
接着往上recurse back的时候, 就是用Math.max(left[1] , right[0]) 来找出更长length的一侧
因为left是从left node 过来的, left[1] 就是left node 的right node 的最长length, 这个符合zigzig 一左一右的规律.
然后因为有可能left/right node 下面是好几个subtree, 所以我们需要继续再用当前的max(left[1],right[0]) 和 Math.max(left[2],right[2])这个global length 去比较一下.
解释到这儿就差不多了.

class Solution {
    public int longestZigZag(TreeNode root) {
        return dfs(root)[2];
    }

    private int[] dfs(TreeNode root) {
        if (root == null) return new int[]{-1, -1, -1};
        int[] left = dfs(root.left), right = dfs(root.right);
        int res = Math.max(Math.max(left[1], right[0]) + 1, Math.max(left[2], right[2]));
        return new int[]{left[1] + 1, right[0] + 1, res};
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值