题1:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
题2:
根据一棵树的中序遍历与后序遍历构造二叉树。
这两道题的解法是一样的,模板也是一样的
我们以题1为例
思路:
前序排列意义图 根|左子树|右子树
后序排列意义图 左子树|根|右子树
而我们要找根1和左右孩子根2的位置分别在哪
前序遍历中,根总是在所在子树的第一个位置,[3,9,20,15,7]中3便是根1,后面是其左右子树
同时左右子树的根都在其子树前序遍历的第一个位置,所以[3,9,20,15,7] 中9便是左子树根2
问题在于如何得到右子树的范围
解决:在中序中找到根,左边的个数便是前序遍历中左子树的范围。 [9,3,15,20,7],所以左子树有1个数9,那么前序中20,15,7是右子树,所以20是右子树根2
递归设计:
而对于其左右子树而言,找子树的左右子树根,又是一个相同问题,我们只要把参数改变,便可用相同步骤解决。正如图1,2所示。
基例:由于我i们不断改变参数为其子树,当子树列表为空时,便是结束
问题1代码:
def dg(preorder,inorder):
if not inorder:
return None
b=TreeNode(preorder[0])
m=inorder.index(b.val)
b.left=dg(preorder[1:m+1],inorder[0:m])
b.right=dg(preorder[m+1:],inorder[m+1:])
return b
return dg(preorder,inorder)
问题2代码:
def dg(inorder,postorder):
if not inorder:
return None
b=TreeNode(postorder[-1])
m=inorder.index(b.val)
b.right=dg(inorder[m+1:],postorder[m:-1])
b.left=dg(inorder[:m],postorder[:m])
return b
return dg(inorder,postorder)