题目:重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。假设输入的前序遍历和中序遍历的结果都不包含重复数字。
例如:输入
前序遍历【1,2,4,7,3,5,6,8】
中序遍历【4,7,2,1,5,3,8,6】,
则重建二叉树 【1, 2, 3, 4, 5, 6, 7, 8】
题目分析
对于前序遍历,其遍历规则是 根节点→左子树→右子树
对于中序遍历, 其遍历规则是 左子树→根节点→右子树
因此对于前序遍历的第一个数字就是根节点的值
扫描中序遍历序列,就能确定根节点的位置
根据中序遍历序列的特点,在根节点的值1前面的3个数字都是左子树节点的值,位于1后面的数字都是右子树节点的值。
由于在中序序列中,有3个数字是左子树节点的值,因此左子树共有3个左字节点。同样,在前序序列中,根节点后面的3个数字就是左子树节点的值,再后面的所有数字都是右子树节点的值。这样就从前序遍历和中序遍历两个序列中分别找到了左、右子树对应的子序列
接下来的事情可以使用递归完成。
code
定义树节点的类
class Node(object):
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
def travel(self):
# 用于打印重建好的二叉树
if self is None:
return
queue = [self]
while queue:
cur_node = queue.pop(0)
print(cur_node.item, end=' ')
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
递归实现二叉树的重建
def ReConstructBinaryTree(PreArray, MidArray):
if len(PreArray) > 0:
root = Node(PreArray[0])
rootId = MidArray.index(root.item)
root.lchild = ReConstructBinaryTree(PreArray=PreArray[1: rootId+1],
MidArray=MidArray[0: rootId])
root.rchild = ReConstructBinaryTree(PreArray=PreArray[rootId+1:],
MidArray=MidArray[rootId+1:])
return root
测试程序
if __name__ == '__main__':
ReConstructBinaryTree([1,2,4,7,3,5,6,8], [4,7,2,1,5,3,8,6]).travel()
打印输出,输出结果为重建二叉树的层次遍历。