剑指offer-重建二叉树-python版本

面试题07. 重建二叉树

难度中等

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

 

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

分析:

先找出前序遍历的第一个为root。然后查找该值在中序遍历中的位置设为index 

 对于中序遍历的数组: 
中序的 [0:index] 为左子树的中序遍历序列
中序的 [index+1:] 右子树的中序遍历序列

使用递归:前序遍历中左子树长度为除了根节点 [1:index+1] 同时中序遍历左子树长度为[:index]

                 前序遍历中右子树长度为除了根节点到[index+1 : ] 同时中序遍历右子树长度为[index+1 : ] 

递归的过程不断查找先序中的元素为此时的root节点,此节点在中序中划分左右子树,直到区间为空划分完毕退出递归。

剑指offer-重建二叉树-python版本_第1张图片

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def buildTree(self, pre, inorder):
        #pre是前序遍历 inorder是中序遍历 not pre 和not inorder效果一样,因为这两个序列长度一样
        if not pre :
            return None 

        root = TreeNode(pre[0]) #根节点一定是pre的第一个数            
        index = inorder.index(root.val)   # 中序遍历时候root的下标      

        root.left = self.buildTree(pre[1:index+1],inorder[:index]) #pre去掉第一个根节点
        root.right = self.buildTree(pre[index+1:],inorder[index+1:])

        return root

 

  

你可能感兴趣的:(算法与数据结构,算法,二叉树,数据结构)