重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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

浙公网安备 33010602011771号