二叉树中的最长交错路径

二叉树中的最长交错路径


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

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

请你返回给定树中最长 交错路径 的长度。

题解
动态规划
每遍历到一个节点就需要当前点的最长交错路径
定义dp[2]
dp[0]表示当前节点下一步走左子树的交错路径数
dp[1]表示当前节点下一步走右子树的交错路径数

dp[0]的交错路径数就是其右子树的交错路径数+1
dp[1]的交错路径数就是其左子树的交错路径数+1

使用变量记录下最大的交错路径数。
自此形成一个自底向上的dfs

public class longestZigZag {
    private int maxPath=0;
    public int longestZigZag(TreeNode root){
        dfs(root);
        return maxPath;
    }

    private int[] dfs(TreeNode root){
        int[] dp=new int[2];
        if (root==null){
            dp[0]=-1;
            dp[1]=-1;
            return dp;
        }
        int[] left=dfs(root.left);
        int[] right=dfs(root.right);
        dp[0]=1+left[1];
        dp[1]=1+right[0];
        maxPath=Math.max(maxPath,Math.max(dp[0],dp[1]));
        return dp;
    }
}
首先,我们需要知道什么是二叉树路径二叉树路径是指从树的根结点到任意结点的经过的结点序列。而最长路径则是指从树的根结点到叶子结点路径包含结点数最多的那条路径。 要输出最长路径上的结点,可以考虑使用深度优先搜索(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` 方法来获取最长路径上的结点序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值