一、题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
引自:leetcode-cn.com/problems/ba…
题目链接:110. 平衡二叉树
二、思路分析:
- 问题转化:平衡二叉树的特点是树的每个结点的左右子树的深度差值小于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]
四、参考学习网址
本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情