剑指Offer07.重建二叉树Golang版
1. 问题描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/
9 20
/
15 7
2. 思路
这是经典的二叉建树题目。
给定前序和中序可以建立唯一二叉树,给定后序和中序可以建立二叉树。
- 根据preorder找到根节点 即preorder[0]
- 在inorder中找到根节点的位置 即inorder.index(preorder[0])
- 在inorder中找到左子树和右子树 即inorder[:index]以及inorder[index+1:]
- 在preorder中找到左子树和右子树 即preorder[1:1+index]以及preorder[1+index:]
递归构建左子树和右子树
3. 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
root := &TreeNode {
Val : preorder[0],
Left : nil,
Right : nil,
}
i := 0
for ; i < len(inorder); i++ {
if root.Val == inorder[i] {
break
}
}
root.Left = buildTree(preorder[1:i+1], inorder[:i])
root.Right = buildTree(preorder[i+1:],inorder[(i+1):])
return root
}