剑指offer07重建二叉树
题目 :
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 :
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
思路:
要根据给出的前序和中序遍历,先确定树的根节点,左子树的范围,右子树的范围
这样的话就能快速的写出代码
前序遍历 : [根节点 | 左子树 | 右子数]
根左右
中序遍历 : [左子树 | 根节点 | 右子数]
左根右
1.
先找到根节点为3,那么前序的后面四个就是子树的范围
然后看中序遍历的节点值为3的那个点,9位于3
的左边,那么他就是在左子树
15,20,7 在3
的右边,那么他们是右子数里面的节点
- 前序 : [3 | 9 | 20,15,7]
- 中序 : [9 | 3 | 15,20,7]
那我们现在至少可以画出个这样的图
2.那么第一个的树基本结构就已经完成了
再将他细分
树可以分为左子树右子树,根节点
但是右子树又能看做一个树来排部
其实这就是一个递归的过程
分析方法和第一步一样
右子数的前序 :[20 | 15 | 7]
右子数的中序 :[15 | 20 | 7]
这样就将一个树分成多个部分,多个部分又能划分为更小的部分
这样一步一步的往下走那么就能将整个数给划分出来
这样我们就能够根据这个思路来写出算法
递归的实现
需要进行判断哦
若是测试用例传入为空可能就会报错
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func buildTree(preorder []int, inorder []int) *TreeNode {
length := len(preorder)
if length == 0 {
return nil
}
newTree = &TreeNode{
preorder[0],nil,nil}
var indexTree int //用来标记在中序遍历中的根节点位置
for i := 0;i < length;i++ {
// 利用for循环来找到根节点在中序遍历中的位置
if inorder[i] == preorder[0]{
indexTree = i
break
}
}
newTree.Left = buildTree(preorder[1:indexTree+1],inorder[:indexTree])
newTree.Right = buildTree(preorder[indexTree+1:],inorder[indexTree+1:])
return newTree
}
这样我们就能够构建一颗给定的二叉树了