输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3
/ \
9 20
/ \
15 7
给出的初始代码为:
# 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:
解题思路
利用递归的思想
给定preoder和inorder:
- 根节点必为preorder的第一个元素preorder[0];
- 找到inorder中preorder[0]所在的位置index;
- 那么,inorder中index之前的index个元素即为左子树的中序遍历;inorder中index之后的(n-index-1)个元素即为右子树的中序遍历;
- 而preorder的第2个~第(index+1)个元素即为左子树的前序遍历;preorder的最后(n-index-1)个元素即为右子树的前序遍历。
- 从而分别得到左子树和右子树的preoder和inorder,继而完成递归。
如下图所示:
代码如下
# 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:
if (not preorder): # 空树
return None
else:
tree = TreeNode(preorder[0]) # 顶点
index = inorder.index(preorder[0]) # 中序遍历中左右树的分界点
# index左边的即为左子树的inorder;右边亦然
left_inorder = inorder[:index]
right_inorder = inorder[index+1:len(inorder)]
# 顶点后的index个数构成的list即为左子树的preorder;最后的即为右子树的preorder
left_preorder = preorder[1:1+index]
right_preorder = preorder[1+index:len(preorder)]
# 递归生成树
tree.left = self.buildTree(left_preorder,left_inorder)
tree.right = self.buildTree(right_preorder,right_inorder)
return tree
遇到的问题
在初始代码中,仅根据给出的TreeNode类中的__init__()函数,self.right, self.left都是None。那怎么给TreeNode赋值呢?
难道要更改class TreeNode中的代码?
当然是在Solution里写啊!比如root = TreeNode(3), 那么给左子树和右子树赋值只需要root.left = XXX; root.right = XXX.即可
还是对Python基础差对面向对象不熟啊!