给定一个二叉树,判断它是否是高度平衡的二叉树。
一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树
递归的顺序可以由上至下,也可以有下至上
如果要判断一个树的节点是否为平衡那么:
- 左子树高度与右子树高度之差不超过1
- 左节点是平衡节点
- 右节点是平衡节点
那么同时满足以上三个条件即可认为他是平衡。
首先第一点,左子树高度与右子树高度之差不超过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