二叉树种类相关问题--二叉搜索树

74 阅读1分钟

二叉搜索树

不同的二叉搜索树【leetcode-95】

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

解题思路

  • 遍历数组范围,用每个元素作为根节点
  • 使用递归,分别获取左子树和右子树,进行组合,然后加上根节点,返回

运行效率

MWJUDZ_3P(1M5PPDB_FIE24.png

代码如下

class TreeNode {
  val: number;
  left: TreeNode | null;
  right: TreeNode | null;
  constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    this.val = val === undefined ? 0 : val;
    this.left = left === undefined ? null : left;
    this.right = right === undefined ? null : right;
  }
}

function generateTrees(n: number): Array<TreeNode | null> {
  const arr = new Array(n).fill("").map((item, index) => index + 1);
  return toSearchTree(0, arr.length - 1);

  function toSearchTree(start: number, end: number): TreeNode[] {
    if (start > end) {
      return [];
    }
    if (start === end) {
      return [new TreeNode(arr[start])];
    }
    let res: TreeNode[] = [];
    for (let j = start; j <= end; j++) {
      const leftNodes = toSearchTree(start, j - 1);
      const rightNodes = toSearchTree(j + 1, end);
      if (leftNodes.length && rightNodes.length) {
        res = res.concat(
          leftNodes.flatMap((litem) =>
            rightNodes.map((ritem) => {
              const root = new TreeNode(arr[j]);
              root.left = litem;
              root.right = ritem;
              return root;
            })
          )
        );
      } else if (leftNodes.length) {
        res = res.concat(
          leftNodes.map((item) => {
            const root = new TreeNode(arr[j]);
            root.left = item;
            return root;
          })
        );
      } else if (rightNodes.length) {
        res = res.concat(
          rightNodes.map((item) => {
            const root = new TreeNode(arr[j]);
            root.right = item;
            return root;
          })
        );
      } else {
        res.push(new TreeNode(arr[j]));
      }
    }

    return res;
  }
}

const res = generateTrees(3);

debugger;