您的位置:首页 > 其它

判断一棵树是否为平衡二叉树的算法

2016-04-18 01:20 281 查看
上厕所时饶有兴致地看了下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,然后逐层累加即可。

这里参考了:/article/7037570.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;

}

};

这是递归的做法,后续有时间可以研究非递归算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: