上厕所时饶有兴致地看了下leetCode的110题,难度为easy,于是给了自己信心:判断一棵树是否为平衡二叉树。
平衡二叉树,即一棵树的左子树与右子树的深度之差不能大于1,并且每一个子节点都是平衡二叉树。
此问题解决方案应该有很多,可以递归,也可以不递归,递归当然容易理解,代码也偏少,但使用递归得注意一点,本问题需要完成两步:1、得到一个节点左右子树的深度,计算差值。2、对这棵树的每个子节点均重复1的计算与判断。
1、计算左右子树深度,计算差值,有很好的算法:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
逻辑就是调用递归遍历左右子树,令最末端的节点深度为1,然后逐层累加即可。
这里参考了:http://www.cnblogs.com/GoAhead/archive/2012/05/22/2513847.html,里面还包含有非递归的取深度,有待学习。
2、对每个节点均执行,做法同上,稍稍有微调,采用先序遍历算法,先计算父节点,然后到两个子。
总的代码如下:
class Solution {
public:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
public:
bool isBalanced(TreeNode* root) {
if(root == NULL)
return true;
int leftLv = getTreeDepth(root->left);
int rightLv = getTreeDepth(root->right);
int div = leftLv > rightLv?leftLv – rightLv:rightLv – leftLv;
if(div > 1)
return false;
int res = isBalanced(root->left) && isBalanced(root->right);
if(res)
return true;
return false;
}
};
这是递归的做法,后续有时间可以研究非递归算法。