剑指 Offer 07. 重建二叉树

目录

剑指 Offer 07. 重建二叉树

mid

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

image-20220228193829120

分治

image-20220228194014990
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func buildTree(preorder []int, inorder []int) *TreeNode {
	hash := make(map[int]int)
    // 构建中序遍历的哈希表
	for i, val := range inorder {
		hash[val] = i
	}

	var bt func(preorder []int, inorder []int, offset int) *TreeNode
	bt = func(preorder []int, inorder []int, offset int) *TreeNode {
		// 为了方便哈希表查找 添加offset参数为相对0位置的偏移量
		if len(preorder) == 0 {
			return nil
		}
		root := TreeNode{Val: preorder[0]} // 找到根节点
		i := hash[root.Val] - offset       // 找到根节点在中序遍历中的索引位置

		root.Left = bt(preorder[1:i+1], inorder[:i], offset)
		root.Right = bt(preorder[i+1:], inorder[i+1:], offset+i+1)
		return &root
	}
	root := bt(preorder, inorder, 0)
	return root
}