题目链接:
- 牛客网:判断是不是平衡二叉树
题解:
/*
* function TreeNode(x) {
* this.val = x;
* this.left = null;
* this.right = null;
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
function IsBalanced_Solution( pRoot ) {
// write code here
// 定义一个标志位,表示是否为平衡二叉树,默认为true,是平衡二叉树
let flag = true
// 定义一个深度优先搜索函数,用来计算节点高度并检查是否平衡
function dfs(root) {
// 如果结点不存在或者已经不是平衡二叉树了,返回高度0
if (!root || !flag) return 0
// 递归计算左子树的高度
let left = dfs(root.left)
// 递归计算右子树的高度
let right = dfs(root.right)
// 如果左右子树高度差大于1,说明不平衡,将flag设置为false
if (Math.abs(left - right) > 1) {
flag = false
return
}
// 返回当前节点的高度,为左右子树最大值加1
return Math.max(left, right) + 1
}
// 调用深度优先搜索函数,开始遍历树
dfs(pRoot)
// 返回标志位,表示整个树是否是平衡二叉树
return flag
}
总结:
var isBalanced = function (root) { 定义了一个函数 isBalanced,它接收一个二叉树的根节点 root 作为参数,用来判断这棵树是否是平衡二叉树。
let flag = true; 定义了一个变量 flag,用来表示当前树是否是平衡二叉树,默认为 true。
接着定义了一个深度优先搜索函数 dfs,用来计算节点的高度并检查是否平衡:
if (!root || !flag) { return 0; } 如果当前节点为空或者已经发现不平衡了(flag为 false),直接返回高度 0。
const left = dfs(root.left); 递归计算左子树的高度。
const right = dfs(root.right); 递归计算右子树的高度。
if (Math.abs(left - right) > 1) { flag = false; return; } 如果左右子树的高度差大于 1,说明不平衡,将 flag 设为 false,并直接返回,不再计算高度。
return Math.max(left, right) + 1; 返回当前节点的高度,即为左右子树高度的较大值加 1。
- dfs(root); 调用深度优先搜索函数,开始遍历整棵树,检查每个节点的平衡性。
- return flag; 最后返回 flag,表示整个树是否为平衡二叉树。
整体的逻辑是通过深度优先搜索遍历每个节点,同时计算左右子树的高度,如果发现任意节点的左右子树高度差大于 1,则将 flag 设置为 false,最终判断整个树是否是平衡的。