JS平衡二叉树

613 阅读1分钟

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

一棵高度平衡二叉树定义为:

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

image.png

image.png

一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树

递归的顺序可以由上至下,也可以有下至上

如果要判断一个树的节点是否为平衡那么:

  1. 左子树高度与右子树高度之差不超过1
  2. 左节点是平衡节点
  3. 右节点是平衡节点

那么同时满足以上三个条件即可认为他是平衡。

首先第一点,左子树高度与右子树高度之差不超过1

这就需要我们去计算每个节点下的左右节点高度,每个节点有可能存在子节点,所以最好的方式是采用递归:

const getNodeHeight = (_root) => {
  if (_root === null) return 0
  // +1 为根结点
  return Math.max(getNodeHeight(_root.left), getNodeHeight(_root.right)) + 1
}

一个节点的高度,取决于他左右节点最高的那一个节点。

这样一来第一个条件的判断就解决了。

2和3,判断是佛为平衡节点,与判断 root 的逻辑一致,所以依然采用递归, 当 递归到 根结点位 null 时结束

var isBalanced = function (root) {
  if (root === null) {
    return true
  }
  return (
    Math.abs(getNodeHeight(root.left) - getNodeHeight(root.right)) <= 1 &&
    isBalanced(root.left) &&
    isBalanced(root.right)
  )
}

完整代码:

function TreeCode() {
  let NodeTree = function (ele) {
    this.val = ele;
    this.left = null;
    this.right = null;
  }

  this.createTree = function () {
    let tree = new NodeTree('3');
    tree.left = new NodeTree('9');
    tree.right = new NodeTree('20');
    tree.right.left = new NodeTree('15');
    tree.right.right = new NodeTree('7');
    return tree;
  }
}

// 创建二叉树数据结构,并且生成一个二叉树
let treeCode = new TreeCode();
let root = treeCode.createTree()

const getNodeHeight = (_root) => {
  if (_root === null) return 0
  return Math.max(getNodeHeight(_root.left), getNodeHeight(_root.right)) + 1
}
var isBalanced = function (root) {
  if (root === null) {
    return true
  }
  return (
      // 须同时满足3个条件
    Math.abs(getNodeHeight(root.left) - getNodeHeight(root.right)) <= 1 &&
    isBalanced(root.left) &&
    isBalanced(root.right)
  )
};

console.log(isBalanced(root))

结果: true