【简单】判断是不是平衡二叉树- 2.29

106 阅读2分钟

题目链接:

题解:

/*
 * 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
}

总结:

  1. var isBalanced = function (root) { 定义了一个函数 isBalanced,它接收一个二叉树的根节点 root 作为参数,用来判断这棵树是否是平衡二叉树。

  2. let flag = true; 定义了一个变量 flag,用来表示当前树是否是平衡二叉树,默认为 true。

  3. 接着定义了一个深度优先搜索函数 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。

  1. dfs(root); 调用深度优先搜索函数,开始遍历整棵树,检查每个节点的平衡性。
  2. return flag; 最后返回 flag,表示整个树是否为平衡二叉树。

整体的逻辑是通过深度优先搜索遍历每个节点,同时计算左右子树的高度,如果发现任意节点的左右子树高度差大于 1,则将 flag 设置为 false,最终判断整个树是否是平衡的。