题目链接:https://leetcode-cn.com/problems/balanced-binary-tree
题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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
题解:
题解描述链接:https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww
递归三步曲分析:
- 明确递归函数的参数和返回值
参数为传入的节点指针,返回要传入节点为根节点树的深度。
如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。
所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。
// -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
int getDepth(TreeNode* node)
- 明确终止条件
递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的高度为0
if (node == NULL) {
return 0;
}
- 明确单层递归的逻辑
如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了。
int leftDepth = depth(node->left); // 左
if (leftDepth == -1) return -1;
int rightDepth = depth(node->right); // 右
if (rightDepth == -1) return -1;
int result;
if (abs(leftDepth - rightDepth) > 1) { // 中
result = -1;
} else {
result = 1 + max(leftDepth, rightDepth); // 以当前节点为根节点的最大高度
}
return result;
完整代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//深度:从根节点到该节点最长简单路径边的条数(leetcode以节点计算)-前序遍历
//高度:该节点到叶子节点最长简单路径边的条数(leetcode以节点计算)-后序遍历
int getHigh(TreeNode* node) //返回当前节点最大高度
{
if(node == nullptr)
{
return 0;
}
int leftHigh = getHigh(node->left);
if(leftHigh == -1)
return -1;
int rightHigh = getHigh(node->right);
if(rightHigh == -1)
return -1;
return abs(leftHigh - rightHigh) > 1 ? -1 : max(leftHigh, rightHigh) + 1;
}
bool isBalanced(TreeNode* root) {
return getHigh(root) == -1 ? false : true;
}
};