leetcode1372. 二叉树中的最长交错路径

leetcode1372. 二叉树中的最长交错路径


给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:

  • 选择二叉树中 任意 节点和一个方向(左或者右)。
  • 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
  • 改变前进方向:左变右或者右变左。
  • 重复第二步和第三步,直到你在树中无法继续移动。
  • 交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
    请你返回给定树中最长 交错路径 的长度。

示例 1:
在这里插入图片描述
输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。

思路一:暴力

对于每个节点,都有一个方法,找这个节点对应的最长交叉路径

class Solution {
    public int longestZigZag(TreeNode root) {
        if(root==null)return 0;
        fun(root);
        return maxLength-1;
    }
    //0-left,1-right
    public int maxLength=0;
    public void fun(TreeNode root){
        if(root==null)return;
        int left=traverse(root,0);
        int right=traverse(root,1);
        maxLength=Math.max(maxLength,Math.max(left,right));
        fun(root.left);
        fun(root.right);
    }
    public int traverse(TreeNode root,int direction){
        if(root==null)return 0;
        if(direction==0){
            return traverse(root.left,1)+1;
        }else{
            return traverse(root.right,0)+1;
        }
    }
}

如果数据量太大就会超时.

思路二:

求最短路径的时候,会把当前节点走了多少步算出来,下一步的路径就可以用上一步的路径算,这样就不用从头累加计算了.
根据这个思路,cur表示节点个数,maxLength是最大值.对于每个节点,如果满足交叉路径的条件,那么cur+1,否则cur从2开始.
然后是遍历,在遍历的时候如果满足交叉路径就维持cur+1,否则cur要重新计数.

class Solution {
    public int longestZigZag(TreeNode root) {
        if(root==null)return 0;
        traverse(root,0,1);
        return maxLength-1;
    }
    //0-left,1-right
    public int maxLength=0;
    public void traverse(TreeNode root,int lastDirection,int cur){
//lastDirection表示当前节点是上一个节点的左还是右节点
        if(root==null){
            maxLength=Math.max(cur-1,maxLength);
//cur-1是因为当前节点为空
            return;
        }
        if(lastDirection==0){
            traverse(root.right,1,cur+1);//满足交叉
            traverse(root.left,0,2);//重新计算节点个数
//2是因为自己当前节点,加上下一个节点,如果为空,在return处理
        }else{
            traverse(root.left,0,cur+1);
            traverse(root.right,1,2);
        }
        
    }
}

这样就只用遍历n个节点,复杂度是log(n).
leetcode 54/100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要知道什么是二叉树路径二叉树路径是指从树的根结点到任意结点的经过的结点序列。而最长路径则是指从树的根结点到叶子结点路径包含结点数最多的那条路径。 要输出最长路径上的结点,可以考虑使用深度优先搜索(DFS)来遍历整棵树,记录下每个结点到根结点的路径长度和路径上的结点。在遍历的过程,如果当前结点是叶子结点,那么就判断它到根结点的路径长度是否是当前遍历到的最长路径。如果是,则更新最长路径最长路径上的结点。 以下是示例代码: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def __init__(self): self.max_len = 0 # 最长路径长度 self.max_path = [] # 最长路径上的结点序列 def find_longest_path(self, root): self.dfs(root, [root.val]) return self.max_path def dfs(self, node, path): if not node.left and not node.right: # 叶子结点 if len(path) > self.max_len: self.max_len = len(path) self.max_path = path if node.left: self.dfs(node.left, path + [node.left.val]) if node.right: self.dfs(node.right, path + [node.right.val]) ``` 在这个示例代码,我们定义了一个 `TreeNode` 类来表示二叉树的结点。`Solution` 类的 `find_longest_path` 方法是我们的主要方法,它接受二叉树的根结点作为参数,并返回最长路径上的结点序列。 在 `dfs` 方法,我们首先判断当前结点是否是叶子结点。如果是,就判断当前路径的长度是否大于当前的最长路径长度。如果是,则更新最长路径长度和最长路径上的结点序列。 接下来,我们分别遍历当前结点的左子树和右子树,如果存在的话。在遍历左子树和右子树的过程,我们需要将当前结点的值添加到路径,并继续遍历子树。 最后,我们可以调用 `find_longest_path` 方法来获取最长路径上的结点序列。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值