题目要求:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
题解:
其中涉及到的知识:二叉树前序遍历和中序遍历
二叉树的遍历方式:
1)广序遍历:
对二叉树一层一层的进行遍历
2)深度遍历
前序遍历:先访问根节点,再依次访问左子树和右子树
中序遍历:先访问左子树,再访问根节点,最后访问右子树
后序遍历:先访问左子树,再访问右子树,最后访问根节点
例:
3
/ \
9 20
/ \ / \
21 6 15 7
广序遍历:3,9,20,21,6,15,7
深度遍历:前序:3,9,21,6,20,15,7
中序:21,9,6,3,15,20,7
后序:21,6,9,15,7,20,3
根据以上的描述,我们可知:
1)前序的第一个肯定为根节点
2)中序中根节点前的为左子树,根节点后的为右子树
3)根据中序中左子树元素的数目和右子树元素的数目,可以获取其前序遍历
即:前序: 根节点 | 左子树 | 右子树
中序: 左子树 | 根节点 | 右子树
根据以上原则可以根节点不断的将列表分为左子树和右子树,进行递归处理就可以:
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
node=TreeNode(preorder[0])
index=inorder.index(preorder[0])
left_sub_tree_inorder=inorder[:index]
left_sub_tree_preorder=preorder[1:1+index]
right_sub_tree_inorder=inorder[index+1:]
right_sub_tree_preorder=preorder[1+index:]
node.left = self.buildTree(left_sub_tree_preorder, left_sub_tree_inorder)
node.right = self.buildTree(right_sub_tree_preorder, right_sub_tree_inorder)
return node