剑指offer07.重建二叉树

剑指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
}

这样我们就能够构建一颗给定的二叉树了

猜你喜欢

转载自blog.csdn.net/m0_53804791/article/details/119563481