题目的描述就不写了,给出一个前序/后序遍历的得到的数组,还有中序的数组构造出二叉树。
刚开始感觉是递归着做,后来105参考了下答案,106也就很快做出来了,毕竟是同样的思路。
按照题目示例:
后序:【9,15,7,20,3】。前序:【9,3,15,20,7】。
我们知道对于一个三节点二叉树,b,c是a的子树,那么中序:b,a,c,后序:b,c,a。
我们想要得到这个树的根节点,就要从后往前的处理后序遍历数组,这里首先是3。
3是根节点,我们还知道从前序遍历是树在最底层的投影相对位置。
那么就是说,3的左边【9】就是左子树,右边【15,20,7】就是右子树。我们依靠递归来不断地寻找它的根节点,也就是自顶向下构造出了一棵树。
接下来的细节是如何寻找下一个根节点。观察示例以及abc的示例,根节点向前一个节点总是右子树的根节点,而左子树的根节点与右子树的根节点相差了根节点+右边根的左子树的那么多距离。
接下来就是代码实现。
def create(inst,inend,index):
#inst中序序列起点,inend中序序列终点,index后序序列根节点位置
if inst<=inend:#注意python特性,在inst>inend时会返回None
v=postorder[index]#根节点值
i=inorder.index(v)#用list的index函数查找根的位置,为了分割中序序列为左右子树序列
t=TreeNode(v)
#右子树的根节点在前一个位置
t.right=create(i+1,inend,index-1)
#左子树的根节点与右子树根节点还差了一个右子树
t.left=create(inst,i-1,index-(inend-i)-1)
return t
这是用后序,中序构造。
前序的完全可以举一反三,还是abc例子,前序遍历是:a,b,c,也就是说,根节点在第一个
直接改一改index的变化方式即可。
def create(inst,inend,index):
if inst<=inend:
v=preorder[index]
i=inorder.index(v)
t=TreeNode(v)
t.right = create(i + 1, inend, index + 1 + (i - inst))
t.left=create(inst,i-1,index+1)
return t
唯一要注意的一点是,根节点的下一个是左子树的根节点,然后隔了一个左子树是右根节点。
其余的大同小异。