剑指offer-39-平衡二叉树的判断(栈实现)
先给出题目:
由于题目里给的默认节点类型里没有树高的变量,所以得要自己用函数去计算树高并作比较,看了下答案里的做法是用两个函数来实现,IsBalanced_Solution函数里定义树高和IsBalanced函数,通过树高的引用传参并调用自己实现递归,并实现里层函数对外层函数变量的修改。
//后续遍历二叉树,遍历过程中求子树高度,判断是否平衡
class Solution {
public:
bool IsBalanced(TreeNode *root, int & dep){
if(root == NULL){
return true;
}
int left = 0;
int right = 0;
if(IsBalanced(root->left,left) && IsBalanced(root->right, right)){
int dif = left - right;
if(dif<-1 || dif >1)
return false;
dep = (left > right ? left : right) + 1;
return true;
}
return false;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
int dep = 0;
return IsBalanced(pRoot, dep);
}
};
这里我给出另外一种实现的算法,只用一个函数和一个辅助的栈,来达到同样的效果,代码如下
//判断AVL树
//先序遍历访问子树:在每个递归中先深入节点左子树判断是否平衡,
//然后跳出左子树返回布尔值,并将左子树高压入栈,
//再进入右子树判断,跳出右子树并将树高入栈。
//一旦当前递归的左右子树的递归均跳出,便确定左右子树是否平衡
//若子树都平衡且高度差<2则返回TRUE,连续两次出栈
//新树高为子树高最大者+1,并入栈
class Solution {
public:
stack<int> S0;
bool IsBalanced_Solution(TreeNode<int>* pRoot)
{
if (pRoot == NULL)
{
S0.push(0);
return 1;
}
if (IsBalanced_Solution(pRoot->leftChild) && IsBalanced_Solution(pRoot->rightChild))
{
int e_l = S0.top(); S0.pop();
int e_r = S0.top(); S0.pop();
if (e_l - e_r<2 && e_l - e_r>-2)
{
S0.push((e_l > e_r ? e_l : e_r) + 1);
return 1;
}
else
return 0;
}
else
return 0;
}
};
实际上很多用函数递归来实现的算法都和栈这种数据结构有关系,甚至可以互相转换。
以上是我个人的想法和总结,如有错误请指正。