剑指offer 7.重建二叉树 Python解法

题目描述:根据前序遍历和中序遍历重建二叉树,假设遍历结果中不包含重复的数字。

分析:这题看起来好难啊。见到二叉树的题就打怵。

画图就相对清楚了。递归时的左右子树的位置下标,画一画就得出了。特表注意,列表的“左闭右开”,右边的值是取不到的!

 

附带着,由重建的二叉树,很容易写出后序遍历。

(下边的代码中,定义为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)

 

你可能感兴趣的:(剑指offer)