Python-剑指offer(4)重建二叉树
原创
©著作权归作者所有:来自51CTO博客作者二哥不像程序员的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
环境Python2.7.3
二叉树遍历的规则
前序遍历的规则:
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树
中序遍历的规则:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
后序遍历二叉树的规则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
解析:根据前序遍历二叉树的规则可知前序遍历结果的第一个元素即为整个二叉树的根节点,知道了根节点之后,根据中序遍历的组成结构我们可以知道左子树和右子树所含元素,对左右子树递归调用二叉树重建函数,最后即可返回整个重建后的二叉树。
# -*- 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 len(pre) == 0:
return None
else:
root = TreeNode(pre[0])
for i in range(len(tin)):
if tin[i] == pre[0]:
break
root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i])
root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])
return root