4. 重建二叉树

题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


思路
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
已知中序遍历和前序(或者后序)遍历可以确定一棵唯一的二叉树,已知前序遍历和后序遍历不能确定一棵唯一的二叉树。
本题可用递归的思想,已知前序遍历和中序遍历,前序遍历的第一个节点必为根节点,这个节点可以将中序遍历划分成左子树和右子树。

思想如下:
a、根据前序遍历结果,第一个元素为二叉树的根结点;
b、观察中序遍历结果,根结点左侧的为左子树,若左子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;根结点右侧的为右子树,若右子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;
c、上面的过程是递归的。先找到当前树的根结点,然后划分为左右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。


代码实现

# -*- 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(len(pre) == 0):
            return None
        elif(len(pre) == 1):
            return TreeNode(pre[0])
        else:
            root = TreeNode(pre[0])
            index = tin.index(pre[0])
            root.left = self.reConstructBinaryTree(pre[1:index+1],tin[0:index])
            root.right = self.reConstructBinaryTree(pre[index+1:],tin[index+1:])
        return root