题意:
判断一个二叉树是不是平衡二叉树
别人的思路:
使用递归对于每一个点判断是否平衡点,所以需要一个计算此点深度的getDepth()方法
int getDepth(TreeNode *node)
{
int left =0;
int right=0;
if (node == NULL)
return 0;
if (node->left != NULL)
left = getDepth(node->left);
if (node->right != NULL)
right = getDepth(node->right);
return (left > right? left : right) + 1;
}
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
if (abs(getDepth(root->left) - getDepth(root->right)) > 1)
return false;
return (isBalanced(root->left) && isBalanced(root->right));
}
我的思路:
这题我的方法beat 80%,虽然也不是很多但是是我个人的新高啊!
而且看起来简洁很多有木有!
class Solution {
public:
bool isBalanced(TreeNode* root) {
bool the = true;
//这里这个布尔值the,之后作为引用传入的,之所以作为引用是因为我希望在不断的递归中一直用the来存储是否仍旧满足平衡树条件
btree(0,root,the);
return the;
}
int btree(int i,TreeNode* node, bool &the){ //btree是返回此树的深度的
if(node == NULL || the == false) return i; //如果该节点为NULL,说明递归到底了,可以返回,或者前面已经判断存在 非平衡状态了,那么之后就其实没必要递归了,也直接返回
int left = btree(i+1,node->left,the);
int right = btree(i+1,node->right,the);
if(left-right > 1 || right-left > 1) the = false; //计算出左右节点的深度,如果绝对值大于1,则the置为false,the是引用,可以想象成全局的
return max(left,right); //此节点的高度为子节点最大值
}
};
Tips:
在思考算法的时候,我进了一个坑,那就是想存储所有叶子结点的大小,然后比较最大值和最小值差值是否大于1.
但是这是错误的思路,因为一个节点的深度是其 最大深度
比如一个节点
左边,最深是 5
右边,最深是 4,但是存在 3 的子节点
此节点是平衡的,但是存在 5-3 > 1