从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
这是我们数据结构学习二叉树必考的题型之一,但我们这次需要编程做出,那么让我们回忆一下我们如何用手推算这道题,并且写好递归三个条件:
- 递归终止条件:前序遍历数组中为空
- 每次递归做什么:根据前序遍历的preorder[i]在中序遍历数组中找对应元素,并以preorder[i]把中序遍历数组分为左子树和右子树部分,preorder[i]自己则作为这一层的根节点。
- 返回什么:返回根节点
根据这个思路,这道题解出并不困难:
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的最后一个数往前数起:
- 递归终止条件:后序遍历数组中为空
- 每次递归做什么:根据后序遍历的postorder[-1]在中序遍历数组中找对应元素,并以postorder[-1]把中序遍历数组分为左子树和右子树部分,postorder[-1]自己则作为这一层的根节点。
- 返回什么:返回根节点
解法如下:
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]