【剑指offer】10-重建二叉树
题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思考:
二叉树前序遍历,第一个数就是根节点,在中序遍历中找到该根节点的位置,就能区分出左右子树。再而在左右子树中,分别找到前序遍历中的根节点,重复上述操作。---> 递归!!
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if not pre or not tin: return None if len(pre) <= 0 or len(tin) <= 0: return None root = TreeNode(pre[0]) # 从前序遍历中找根节点,找到后放入treenode中 pos = tin.index(pre[0]) # 在中序遍历中找到根节点的位置 tinLeft = tin[:pos] # 中序遍历中的左子树 tinRight = tin[pos+1:] preLeft = pre[1:pos+1] # 前序遍历中的左子树 preRight = pre[pos+1:] # 再重新将分出来的左子树,的前序和中序遍历,看成新的遍历,递归 root.left = self.reConstructBinaryTree(preLeft, tinLeft) root.right = self.reConstructBinaryTree(preRight, tinRight) return root
写的时候遇到的问题:
1. 特殊情况的考虑:没有前序/中序遍历的情况;前序/中序长度为0的情况
2. pre[0]就是根节点,但是要把它放入二叉树TreeNode中!TreeNode中的left就是左子树,right是右子树
3. root现在既然是TreeNode类,就会有left和right