题目描述
给定一个二叉树,判断它是否是平衡二叉树
本题思路
判断是否平衡需要判断树中所有节点的左右子树的高度差。那么思路就是求出左右子树的高度,然后如果差值小于等于1,则返回二叉树的高度,否则返回-1,表示已经不是二叉平衡树。
递归
递归代码如下:
class Solution {
public:
// 返回高度,如果不平衡则返回-1
int getHeight(TreeNode* node) {
if (node == nullptr)
return 0; // 为空则无高度
int leftHeight = getHeight(node->left);
if (leftHeight == -1)
return -1;
int rightHeight = getHeight(node->right);
if (rightHeight == -1)
return -1;
int result;
if (abs(leftHeight - rightHeight) > 1)
return -1;
else
return 1 + max(leftHeight, rightHeight);
return result;
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
误区
递归一定要围绕着整体来想。int leftHeight = getHeight(node->left);写代码时还没写完整个递归,就开始想左子树高度为什么等于getHeight。自己调用自己,自己都没有完善能想出什么(纯死循环)。应该先相信这就是可以求出子树的高度,向下逐步完善整个单层递归的逻辑。
总结
二叉树的题目想利用递归求解,需要将前中后序遍历理解深刻会更有助于解题。
迭代
迭代暂时没掌握