【剑指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

原文地址:https://www.cnblogs.com/RebeccaG/p/11966461.html