[路飞][LeetCode]95_不同的二叉搜索树 II

105 阅读1分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 **。可以按 任意顺序 返回答案。

示例 1:

输入: n = 3
输出: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:

输入: n = 1
输出: [[1]]

提示:

  • 1 <= n <= 8

解题思路

  • 我们先回顾一下二叉搜索树的特点:左<根<右
  • 从特点我们可以看出,如果一个数i作为根节点,那么所有比i小的会用来构建左子树
  • 相反所有比i大的将用来构建右子树
  • 因此,我们在以某数为根节点时需要分别找出其左子树种类以及右子树种类
  • 然后我们穷举以i为根节点的所有左右子树的的组合

解题代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number} n
 * @return {TreeNode[]}
 */
var generateTrees = function(n) {
    const getBst = (low,high)=>{
        if(low>high) return [null] // 指针交错递归终止
        if(low==high) return [new TreeNode(low)]
        const res = []
        // i指针滑动,枚举left和right分段的所有可能
        for(let i =low;i<=high;i++){
            const lefts = getBst(low,i-1) // 递归左子树
            const rights = getBst(i+1,high) // 递归右子树
            for(const left of lefts){
                for(const right of rights){
                    // 循环左右两侧的树集合 分别拼接到新树上,并且存储到结果数组中
                    const tree = new TreeNode(i,left,right) // 使用leetcode 提供的TreeNode函数来构建二叉搜索树节点
                    res.push(tree)
                }
            }
        }
        return res
    }
    return getBst(1,n)
};

一生注定漂泊流浪,眼里满是自由和理想,他可能还不知道流浪,是不能回头的远方。

如有任何问题或建议,欢迎留言讨论!