二叉树中的最长交错路径-LeetCode
1372. 二叉树中的最长交错路径 - Longest ZigZag Path in a Binary Tree
🎯 问题描述(来源于LeetCode)
描述:
给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:
- 从任意节点开始,每一步可以向左或向右,但不能连续两次向同一方向移动(即必须左右交替)。
- 路径长度定义为路径上的边数(非节点数)。
返回该树中最长交错路径的长度。
说明:
- 路径可以从任意节点开始,不一定从根节点开始。
- 如果树为空,返回 0。
示例:
- 示例 1:
1 | 输入: root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1] |
- 示例 2:
1 | 输入: root = [1,1,1,null,1,null,null,1,1,null,1] |
💻 解题思路
思路1:DFS 传递方向步数
算法步骤
-
全局变量
ans记录最长交错路径的长度(边数)。 -
定义递归函数
dfs(node, l, r):l:当前节点向左走时能形成的交错路径长度(从父节点方向来,若父节点方向为右,则当前可向左形成l步)。r:当前节点向右走时能形成的交错路径长度。- 参数含义:假设从父节点到达当前节点时,如果父节点方向是左,则当前
l表示继续向左的长度为 0(因为不能连续左),r表示转向右的长度为父节点传递的步数+1。具体实现中,我们传入的是「以当前节点为起点,向左右两个方向可以延伸的交错长度」。 - 实际代码中:
dfs(node, l, r)表示以当前节点为结束点,左方向累计步数为l,右方向累计步数为r。然后更新ans为max(ans, l, r)。
-
递归终止条件:
- 如果
node为None,直接返回。
- 如果
-
向子节点递归:
- 如果左子节点存在,调用
dfs(node.left, r + 1, 0):
因为从当前节点向左走,上一步的方向是右(r代表了从上一步右方向来的长度),所以向左时可以延续r+1;而向左后,再下一步不能继续向左,所以右方向参数为 0。 - 如果右子节点存在,调用
dfs(node.right, 0, l + 1):
对称地,向右走时,上一步方向是左(l),所以右方向长度l+1;左方向参数为 0。
- 如果左子节点存在,调用
-
启动递归:
dfs(root, 0, 0),初始时没有上一步方向,两个方向均为 0。 -
返回
ans。
思路1:代码实现
1 | # Definition for a binary tree node. |
思路1:📊 性能分析
- 时间复杂度:,每个节点恰好被访问一次。
- 空间复杂度:,递归栈深度为树高,最坏情况 。
思考
- 本题的关键是状态传递:每个节点需要知道「从上一步是左方向过来的最长路径」和「从上一步是右方向过来的最长路径」,然后决定下一步的方向。
- 也可以使用动态规划 + 后序遍历,每个节点返回
(向左最长,向右最长),然后更新答案,但上述 DFS 传递方式更直接。 - 注意路径长度是边数,代码中
l和r代表已经走过的边数,因此当从节点向子节点走时,步数要加 1。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






