LeetCode:1372.二叉树的最长交错路径

给你一棵以 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

你可能感兴趣的:(数据结构与算法)