[路飞]_leetcode-95-不同的二叉搜索树 II

171 阅读1分钟

[题目地址] [B站地址]

给你一个整数 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

解题思路

本题要求我们根据给定整数 n 创建 1~nn 个节点组成的不同的二叉搜索树,并以数组形式返回。
根据实例1 中我们可以看到,给定整数 3 创建的二叉搜索树其实可以拆解为以 123 为根的二叉搜索树,那它们的左右子树又可以以同理进行拆解,这样递归到区间内只有一个数字的时候,就是一个叶子节点,区间内没有数字的时候,就是 null

有了以上推导,我们就可以通过给定区间,递归创建每个值为根的二叉搜索树,并在回溯的过程中进行树的组装。
每个值为根节点的树的组装其实就是所有左子树的可能与所有右子树的可能进行匹配,同时以当前值为根节点,组成的二叉搜索树。

代码实现

 var generateTrees = function(n) {
  // 传入区间,返回可以构建的二叉搜索树
  function buildTree(l,r){
    // 如果区间内只有一个数字,则返回一个节点
    if(l===r) return [new TreeNode(l)]
    // 如果区间中没有数字,返回null
    if(l>r) return [null]
    // 初始化可创建树的结果数组
    const res = [];
    for(let i = l;i<=r;i++){
      // 获取可创建的左子树数组
      const left = buildTree(l,i-1),
      // 获取可创建的右子树数组
      right = buildTree(i+1,r);
      // 组合所有可能的二叉搜索树
      for(let j = 0;j<left.length;j++){
        const leftNode = left[j]
        for(let k = 0;k<right.length;k++){
          res.push(new TreeNode(i,leftNode,right[k]))
        }
      }
    }
    // 返回可创建的树的数组
    return res;
  }
  // 调用构建二叉搜索树方法并返回返回值
  return buildTree(1,n)
};

至此我们就完成了 leetcode-95-不同的二叉搜索树 II

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