给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:
选择二叉树中 任意 节点和一个方向(左或者右)。
如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
改变前进方向:左变右或者右变左。
重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。
示例 1:
输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
示例 2:
输入:root = [1,1,1,null,1,null,null,1,1,null,1]
输出:4
解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
示例 3:
输入:root = [1]
输出:0
提示:
每棵树最多有 50000 个节点。
每个节点的值在 [1, 100] 之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-zigzag-path-in-a-binary-tree
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def longestZigZag(self, root: TreeNode) -> int:
res = 0 # 返回结果
'''两种情况,第一步向左(0表示)或第一步向右(1表示)'''
dq = collections.deque() # 辅助队列,用来记录某条路径的第一个节点
p = root
# 把root入队
if p.left:
dq.append((p, 0))
if p.right:
dq.append((p, 1))
while dq:
p, pos = dq.popleft()
ans = 0 # 局部变量,计算路径的长度
while p:
ans += 1 # 访问过节点,+1
if pos == 0:
# pos=0,走左边
p = p.left
if p and p.left:
# 下一步,走右边,当前节点的左边不走,入队保存
dq.append((p, 0))
# 下一步,走右边,pos置为1
pos = 1
elif pos == 1:
# 走右边
p = p.right
if p and p.right:
dq.append((p, 1))
pos = 0
res = max(res, ans-1) # 路径长度=节点数-1
return res