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

128 阅读1分钟

判断一颗二叉搜索树是不是平衡的

平衡二叉搜索树

平衡二叉搜索树定义

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。

运行效率

B%X@[`{3(T(PVCW}4$%SH]X.png

代码如下

function isBalanced(root: TreeNode | null): boolean {
  function isBalancedTree(root: TreeNode | null) {
    if (!root) return 0;
    const lh = isBalancedTree(root.left);
    const rh = isBalancedTree(root.right);
    if (lh === -1 || rh === -1 || Math.abs(lh - rh) > 1) {
      return -1;
    } else {
      return Math.max(lh, rh) + 1;
    }
  }

  return isBalancedTree(root) !== -1;
}

统计二叉搜索树个数---不同的二叉搜索树

题目描述

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

解题思路

  • 使用每个节点作为根节点,该以该节点作为根节点的二叉搜索树总数=左子树*右子树的个数
  • 将每个根节点的二叉搜索树相加,就得出了搜有的二叉搜索
  • 也就是f(n) = f(0)f(n-1)+f(1)f(n-1)+....+f(n-1)f(0)

MWJUDZ_3P(1M5PPDB_FIE24.png

代码如下

function numTrees(n: number): number {
  const dp: number[] = [];
  dp[0] = 1;
  dp[1] = 1;
  function getCount(n: number) {
    let i = 0;
    let res = 0;
    while (i <= Math.floor((n - 1) / 2)) {
      res +=
        (dp[i] ?? getCount(i)) * (dp[n - 1 - i] ?? getCount(n - 1 - i)) * 2;
      i++;
    }

    dp[n] = n % 2 === 0 ? res : res - dp[(n - 1) / 2] * dp[(n - 1) / 2];
    return dp[n];
  }
  return getCount(n);
}

将一个有序数组转成平衡二叉搜索树【leetcode-108]

题目描述

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

运行效率

1653802556(1).png

代码如下

function sortedArrayToBST(nums: number[]): TreeNode | null {
  function toBalanceSearchTree(nums: number[], start: number, end: number) {
    if (start > end) return null;
    const mid = Math.floor((start + end) / 2);
    const root = new TreeNode(nums[mid]);
    root.left = toBalanceSearchTree(nums, start, mid - 1);
    root.right = toBalanceSearchTree(nums, mid + 1, end);
    return root;
  }

  return toBalanceSearchTree(nums, 0, nums.length - 1);
}