Construct Binary Tree From Preorder And Inorder Traversal
题目描述
从前序与中序遍历序列构造二叉树:
根据一颗树的前序遍历与中序遍历构造二叉树。
解法
解法一:递归解法
时间复杂度:
O(N)
空间复杂度:
O(N)
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
root := &TreeNode{
Val: preorder[0],
}
var inLen int
for i, v := range inorder {
if v == preorder[0] {
inLen = i
}
}
root.Left = buildTree(preorder[1:inLen+1], inorder[0:inLen])
root.Right = buildTree(preorder[inLen+1:], inorder[inLen+1:])
return root
}
解法二:迭代解法
时间复杂度:
O(N)
空间复杂度:
O(N)
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
index := 0
root := &TreeNode{Val: preorder[0]}
stack := []*TreeNode{root}
for i := 1; i < len(preorder); i++ {
lens := len(stack)
node := stack[lens-1]
if inorder[index] != node.Val {
node.Left = &TreeNode{Val: preorder[i]}
stack = append(stack, node.Left)
continue
}
for lens > 0 && inorder[index] == stack[lens-1].Val {
node = stack[lens-1]
stack = stack[:lens-1]
lens = len(stack)
index++
}
node.Right = &TreeNode{Val: preorder[i]}
stack = append(stack, node.Right)
}
return root
}
Last updated
Was this helpful?