欢迎光临散文网 会员登陆 & 注册

Leetcode 刷题Day2(4)

2022-04-02 16:01 作者:我喜欢喝一点点  | 我要投稿

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

最主要的就是找到确定递归的左右边界~

不过我感觉preorder=preorder这一步的意义还是不太理解。

另外,字典特别容易和数组混啊,如果能用map解决就更直观点了。


#前序遍历 按照根节点|左节点|右节点进行遍历

#中序遍历 按照左节点|根节点|右节点进行遍历

#1.前序遍历的第一个元素为树的根节点

#2.中序遍历中,可根据找到的根节点划分为[左子树|根节点|右子树]

#3.前序遍历中,可根据中序遍历中得到的左右子树中节点的数量,划分为[根节点|左子树|右子树]


# 例如:

# preorder=[3,9,2,1,7]

# inorder=[9,3,1,2,7]

# 得到3为树的根节点,所以9为左子树,2、1、7为右子树,2为右子树的根节点,因此1为右子树的左子树,7为右子树的右子树


# 思路:

# 1.找到根节点preorder[root]

# 2.在inorder中找到对应preorder[root]的索引i,i左侧的为左子树,i右侧的为右子树

# 3.构建左右子树:

# 左子树:根节点的索引 root+1(前序遍历中左子树在根节点右侧,左子树的根节点又是第一个)

# 中序遍历的左边界 left

# 中序遍历的右边界 i-1

# 右子树:根节点的索引 i+root-left+1(即根节点加上左子树的长度再加1)

# 中序遍历的左边界 i+1

# 中序遍历的右边界 right

# 当left>right后,则已经越过根节点,退出。


# Definition for a binary tree node.

# class TreeNode:

#     def __init__(self, x):

#         self.val = x

#         self.left = None

#         self.right = None


class Solution:

    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:

        def solve(root,left,right):

            if left>right: return

            node=TreeNode(preorder[root])

            i=dic[preorder[root]]

            node.left=solve(root+1,left,i-1)

            node.right=solve(i+root-left+1,i+1,right)

            return node

        dic={}

        preorder=preorder

        for i in range(len(inorder)):

            dic[inorder[i]]=i

            #将inorder中的每个值和位子放入字典成为键值对,则可以根据preorder的值找到在inorder中的位置

        return solve(0,0,len(inorder)-1)


另外今天就摸到这里吧, 忍不住放个温迪~


Leetcode 刷题Day2(4)的评论 (共 条)

分享到微博请遵守国家法律