不同的二叉搜索树——回溯

76 阅读1分钟

image.png

二叉搜索树:左《 根《 右,左小于根,根小于右

代码回溯:

  1. 遍历根节点,问题被分解成求其左子树,以及右子树
  2. 大问题分解为了小问题
  3. 然后重复操作,进行递归分解就可以了
  4. 当然因为得到子问题的是数组,所以for循环读取一下

因为二叉搜索树的左小于根小于右的原因所以这样写递归

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return nil
    }
    return helper(1, n)
}

func helper(start, end int) []*TreeNode {
    if start > end {
        return []*TreeNode{nil}
    }
    allTrees := []*TreeNode{}
    // 枚举可行根节点
    for i := start; i <= end; i++ {
        // 获得所有可行的左子树集合
        leftTrees := helper(start, i - 1)
        // 获得所有可行的右子树集合
        rightTrees := helper(i + 1, end)
        // 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上
        for _, left := range leftTrees {
            for _, right := range rightTrees {
                currTree := &TreeNode{i, nil, nil}
                currTree.Left = left
                currTree.Right = right
                allTrees = append(allTrees, currTree)
            }
        }
    }
    return allTrees
}