根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
____________________________________________________________________________________________________________
相似题:刷题---树篇---106. 从中序与后序遍历序列构造二叉树
preorder的首元素是树的根节点,在inorder中找到首元素的位置,那么inorder中根节点的左边是左子树的中序(定义为inleft),右边的是右子树的中序(inright)。
对于preorder而言,第一个元素是根,后面长度为len(inleft)的部分是左子树的前序(preleft),再往后长度为len(inright)的部分为右子树的前序遍历(preright)。
func buildTree(preorder []int, inorder []int) *TreeNode {
root := &TreeNode{0,nil,nil}
if len(preorder) == 0 || len(inorder) == 0 {
root = nil
return root
}
t := preorder[0]
i := 0
for k,v := range inorder {
if v == t {
i = k
break
}
}
root.Val = t
inleft := inorder[:i]
inright := inorder[i+1:]
l := len(inleft)
preleft := preorder[1:l+1]
preright := preorder[l+1:]
root.Left = buildTree(preleft,inleft)
root.Right = buildTree(preright,inright)
return root
}