小黑私募坐在一群顶级985大佬身边,不禁感叹的leetcode之旅:1372. 二叉树中的最长交错路径

动态规划(层次遍历)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def longestZigZag(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        # 动态规划字典,f表示当前结点以左节点为结尾序列的长度,g表示以右结点为结尾序列长度
        f = collections.defaultdict(int)
        g = collections.defaultdict(int)
        # 利用层次遍历初始化队列
        q = collections.deque([root])
        while q:
            top = q.popleft()
            
            if top.left:
                # 父节点交错序列结尾为右节点
                f[top.left] = g[top] + 1
                q.append(top.left)
            if top.right:
                # 父节点交错序列结尾为左节点
                g[top.right] = f[top] + 1
                q.append(top.right)
        max_ = 0
        # 遍历以左结点为结尾的序列长度
        for value in f.values():
            if value > max_:
                max_ = value
        # 遍历以右结点为结尾的序列长度
        for value in g.values():
            if value > max_:
                max_ = value
        return max_

在这里插入图片描述

动态规划(先根遍历)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def longestZigZag(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        # 动态规划字典,f表示当前结点以左节点为结尾序列的长度,g表示以右结点为结尾序列长度
        f = collections.defaultdict(int)
        g = collections.defaultdict(int)
        # 先序遍历
        q = [root]
        while q:
            top = q.pop()
            if top.right:
                g[top.right] = f[top] + 1 
                q.append(top.right)
            if top.left:
                f[top.left] = g[top] + 1
                q.append(top.left)
                # 遍历以左结点为结尾的序列长度
        max_ = 0
        for value in f.values():
            if value > max_:
                max_ = value
        # 遍历以右结点为结尾的序列长度
        for value in g.values():
            if value > max_:
                max_ = value
        return max_

在这里插入图片描述

递归法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def longestZigZag(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        self.max_ = 0
        def dfs(node,is_left,length):
            self.max_ = max(self.max_,length)
            if is_left:
                if node.left:
                    dfs(node.left,1,1)
                if node.right:
                    dfs(node.right,0,length + 1)
            else:
                if node.left:
                    dfs(node.left,1,length + 1)
                if node.right:
                    dfs(node.right,0,1)
        dfs(root,False,0)
        dfs(root,True,0)
        return self.max_

在这里插入图片描述

小黑生活

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值