[LeetCode 110. 平衡二叉树] |刷题打卡

282 阅读1分钟

一、题目描述:

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

本题中,一棵高度平衡二叉树定义为:

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

示例 1:

image.png

输入:root = [3,9,20,null,null,15,7]

输出:true

示例 2: image.png

输入:root = [1,2,2,3,3,null,null,4,4]

输出:false

示例 3:

输入:root = []

输出:true

引自:leetcode-cn.com/problems/ba…

题目链接:110. 平衡二叉树

二、思路分析:

  1. 问题转化:平衡二叉树的特点是树的每个结点的左右子树的深度差值小于2。
  2. 采用递归深度遍历的方式,遍历二叉树的左右子树,并且查看相应的深度差值是否小于2.

三、AC 代码:


class Solution {
    func isBalanced(_ root: TreeNode?) -> Bool {
        // 问题转为:判断二叉树的左右子树的深度之差是否大于等于2
        // 如果大于等于2,说明不是平衡二叉树
        // 如果小于2,说明是平衡二叉树
        return depthOfNode(root) != -1;
    }

    func depthOfNode(_ node: TreeNode?) -> Int {
        
        if (node == nil) {
            // 空树
            return 0;
        }

        // 用leftValue 表示 leftNode 的深度
        let leftNode : TreeNode? = node?.left;
        let leftValue : Int = depthOfNode(leftNode);
        if (leftValue == -1) {
            return -1;
        }

        // rightValue 表示 rightNode 的深度
        let rightNode : TreeNode? = node?.right;
        let rightValue : Int = depthOfNode(rightNode);
        if (rightValue == -1) {
            return -1;
        }

        // 左右子树结点差值均小于2时,才是平衡二叉树
        let flag : Bool = abs(leftValue - rightValue) < 2;
        if (flag) {
            let result = leftValue > rightValue ? leftValue + 1 : rightValue + 1;
            return result;
        } else {
            return -1;
        }
    }
}

// 测试过的用例:
// [1,2,2,3,null,null,3,4,null,null,4]
// [3,9,20,null,null,15,7]

四、参考学习网址

110. 平衡二叉树(从底至顶,从顶至底)

本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情