1. 程式人生 > 實用技巧 >從前序與中序遍歷序列構造二叉樹

從前序與中序遍歷序列構造二叉樹

題目描述:

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意: 你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹:

    3
/ \
9 20
/ \
15 7
//go
/**
 * 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{preorder[0], nil, nil}
    i := 0
    // 在inorder裡root的下標
    for ; i < len(inorder); i++ {
        if inorder[i] == preorder[0] {
            break
        }
    }
    // root前的長度,即左子樹的長度
    stopIndex := len(inorder[:i])+1
    root.Left = buildTree(preorder[1:stopIndex], inorder[:i])
    root.Right = buildTree(preorder[stopIndex:], inorder[i+1:])
    return root
}

解題思路:

preorder第一個元素為root,在inorder裡面找到root,在它之前的為左子樹(長stopIndex),之後為右子樹。

preorder[1]到preorder[stopIndex]為左子樹,之後為右子樹,分別遞迴。

地址:https://mp.weixin.qq.com/s/SNfLHNXK9y1aP93m2RJ7RQ