重建二叉树

题目描述

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

算法实现

1.二叉树的前序遍历序列第一个节点一定是当前根节点;
2.中序遍历序列根据当前根节点可以分成左右子树,根节点左边为左子树,右边为右子树;
3.递归重建二叉树,即根节点的left指向左子树,根节点的right指向右子树。

代码

# -*- 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):
        root = TreeNode(pre[0]) 
        rooti = tin.index(pre[0]) #根节点在中序遍历序列的位置,进而分为左右子树
        left = tin[0:rooti]
        right = tin[rooti + 1:]
        if len(left) == 0:
            leftNode = None #左子树为空
        elif len(left) == 1:
            leftNode = TreeNode(left[0]) #可以确定左子树节点
        else:
            leftNode = self.reConstructBinaryTree(pre[1:len(left) + 1], left) #递归建立左子树
        if len(right) == 0:
            rightNode = None
        elif len(right) == 1: 
            rightNode = TreeNode(right[0])
        else:
            rightNode = self.reConstructBinaryTree(pre[len(left) + 1:], right)
        root.left = leftNode #将根节点的left指向左子树
        root.right = rightNode
        return root
posted @ 2020-03-22 10:43  isshpan  阅读(127)  评论(0)    收藏  举报