leetcode刷题笔记-二叉树6

从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

这是我们数据结构学习二叉树必考的题型之一,但我们这次需要编程做出,那么让我们回忆一下我们如何用手推算这道题,并且写好递归三个条件:

  1. 递归终止条件:前序遍历数组中为空
  2. 每次递归做什么:根据前序遍历的preorder[i]在中序遍历数组中找对应元素,并以preorder[i]把中序遍历数组分为左子树和右子树部分,preorder[i]自己则作为这一层的根节点。
  3. 返回什么:返回根节点

根据这个思路,这道题解出并不困难:

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if preorder==[]:
            return
        root_ind=inorder.index(preorder[0])
        root=TreeNode(preorder[0])
        root.left=self.buildTree(preorder[1:root_ind+1],inorder[0:root_ind])
        root.right=self.buildTree(preorder[root_ind+1:],inorder[root_ind+1:])
        return root
   

这个解法中唯一让人感到比较困惑的可能就是这个preorder[1:root_ind+1],因为这样看来这个数组的preorder[0]会永远不变,但是仔细想想,preorder[1:root_ind+1]的[1:root_ind’+1],不就是preorder[2:root_ind’+1]吗,所以preorder[0]还是在变化的。

从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

这个题思路与上面一题类似,但是要从postorder的最后一个数往前数起:

  1. 递归终止条件:后序遍历数组中为空
  2. 每次递归做什么:根据后序遍历的postorder[-1]在中序遍历数组中找对应元素,并以postorder[-1]把中序遍历数组分为左子树和右子树部分,postorder[-1]自己则作为这一层的根节点。
  3. 返回什么:返回根节点

解法如下:

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if postorder==[]:
            return None
        root_ind=inorder.index(postorder[-1])
        root=TreeNode(postorder[-1])
        root.left=self.buildTree(inorder[0:root_ind],postorder[0:root_ind])
        root.right=self.buildTree(inorder[root_ind+1:],postorder[root_ind:-1])
        return root

这道题的解决代码与上面那道相似,有所不同的是要注意postorder[-1]代表最后一个数,而postorder[root_ind:-1]中则不包括最后一个数,所以不要错误写成postorder[root_ind:-2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值