leetcode 1372. Longest ZigZag Path in a Binary Tree(二叉树中最长的之字形路径)

在这里插入图片描述
找出最长的之字型路径长度。
可以选择从二叉树的任意一个节点出发。
路径长度为路径中的节点数-1.

思路:

符合DFS的特征。
方向是左右交替的,可以定义0,1两个方向。
如果当前方向是左,下一方向就是右,反之亦然。每次长度+1.
在所有长度中记录下最大长度。

有一个问题是可以从任意点出发,是不是还要涉及到遍历二叉树的每个节点,然后对每个节点zigzag呢?
其实可以通过一个方法解决,
比如前一个方向是左,那么下一个方向右的时候长度是+1的,
同时也尝试下一方向是左的情况,这时长度从0+1重新开始。
主要难点就在这里,这个解决了就都好办。

class Solution {
    final int LEFT = 0;
    final int RIGHT = 1;
    int maxStep = 0;
    public int longestZigZag(TreeNode root) {
        zigzag(root, LEFT, 0);
        return maxStep;
    }

    
    void zigzag(TreeNode root, int direct, int len) {
        if(root == null) return;
        if(len > maxStep) maxStep = len;  //比Math.max快
        if(direct == LEFT) {
            zigzag(root.left, RIGHT, len+1);
            zigzag(root.right, LEFT, 1); //从root.right重新开始
        } else {
            zigzag(root.right, LEFT, len+1);
            zigzag(root.left, RIGHT, 1); //从root.left重新开始
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值