题目描述:根据前序遍历和中序遍历重建二叉树,假设遍历结果中不包含重复的数字。
分析:这题看起来好难啊。见到二叉树的题就打怵。
画图就相对清楚了。递归时的左右子树的位置下标,画一画就得出了。特表注意,列表的“左闭右开”,右边的值是取不到的!
附带着,由重建的二叉树,很容易写出后序遍历。
(下边的代码中,定义为hou。不想改了,但是不建议使用这种命名方式。
同样的还有self.vol,其实应该写成val,value的前几个字母。)
注意点:好像从这题开始,后边开始陆续使用递归,递归对于解’树‘的题非常常用。
备注:rebuild函数里,考虑特殊的例子,如果pre这个列表的长度是0,也就是树不存在。
我是最后考虑进去的,即代码不是按照所列的顺序一行一行写的。
其他的注意点,都写在注释里了。
class Node():
def __init__(self,x):
self.vol = x
self.left = None
self.right = None
class Solution():
def rebuild(self,pre,mid): # 重建二叉树,下边用tree表示的
if len(pre)==0:
return None
tree = Node(pre[0])
flag1 = mid.index(pre[0]) # 根据元素值取出下标
tree.left = self.rebuild(pre[1:flag1+1],mid[:flag1]) # 引用成员函数,必须要加self
tree.right = self.rebuild(pre[flag1+1:],mid[flag1+1:]) # 引用成员函数,必须要加self
return tree # 构造好二叉树
def hou (self,tree): # 输出后序遍历
if tree != None:
self.hou(tree.left) # 引用成员函数,必须要加self
self.hou(tree.right) # 引用成员函数,必须要加self
print(tree.vol,end = ' ')
# 测试用。
pre=[1,2,4,7,3,5,6,8]
tin=[4,7,2,1,5,3,8,6]
s = Solution()
tree = s.rebuild(pre,tin)
s.hou(tree)