LeetCode 题集:二叉树遍历

本文介绍 LeetCode 题集中,有关二叉树遍历的问题。


105. Construct Binary Tree from Preorder and Inorder Traversal(从前序与中序遍历序列构造二叉树)


问题描述

LeetCode 105 问题描述 I
LeetCode 105 问题描述 II

思路与代码


由于前序遍历的左端为根节点,可从中序遍历中找到根节点的位置,则其左侧为左子树,右侧为右子树,递归还原出原树即可。

代码如下:

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        # edge cases
        if not preorder or not inorder or len(preorder) != len(inorder):
            return None

        # 哈希表(字典)降低时间复杂度
        dic_index = {inorder[i]: i for i in range(len(inorder))}
        
        def rec(p_start: int, p_end: int, i_start: int, i_end: int):
            # 由于参数中的起止点为闭区间,故终止条件为 >
            # 此处使用 p_start > p_end 亦可
            if i_start > i_end:
                return None

            root = TreeNode(val=preorder[p_start])
            pos = dic_index[preorder[p_start]]
            root.left = rec(p_start=p_start + 1, p_end=p_start + (pos - i_start), i_start=i_start, i_end=pos - 1)
            root.right = rec(p_start=p_end - (i_end - pos) + 1, p_end=p_end, i_start=pos + 1, i_end=i_end)

            return root

        return rec(p_start=0, p_end=len(preorder) - 1, i_start=0, i_end=len(inorder) - 1)

代码中有几处需要注意:

  • 注意递归函数的参数,即起止点的区间为闭区间,对应地,终止条件为 ‘>’ 比较
  • 在中序遍历中查询根节点的位置,可以通过哈希表来降低时间复杂度

运行效果:
LeetCode 105 运行效果


106. Construct Binary Tree from Inorder and Postorder Traversal(从中序与后序遍历序列构造二叉树)


问题描述

LeetCode 106 问题描述 I
LeetCode 106 问题描述 II

思路与代码


本题的思路与前一题相似,区别在于后序遍历的右端为根节点,只要修改递归函数中左右节点的位置参数即可。

代码如下:

# 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 buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not inorder or not postorder or len(inorder) != len(postorder):
            return None

        dic_index = {inorder[i]: i for i in range(len(inorder))}

        def rec(p_start: int, p_end: int, i_start: int, i_end: int):
            # 此处使用 p_start > p_end 亦可
            if i_start > i_end:
                return None

            root = TreeNode(val=postorder[p_end])
            pos = dic_index[postorder[p_end]]
            root.left = rec(p_start=p_start, p_end=p_start + (pos - i_start) - 1, i_start=i_start, i_end=pos - 1)
            root.right = rec(p_start=p_start + (pos - i_start), p_end=p_end - 1, i_start=pos + 1, i_end=i_end)

            return root

        return rec(p_start=0, p_end=len(postorder) - 1, i_start=0, i_end=len(inorder) - 1)

运行效果:
LeetCode 106 运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值