输入一颗二叉树的根节点,判断该树是不是平衡二叉树

输入一颗二叉树的根节点,判断该树是不是平衡二叉树

1. 解法一
    该解法的思路:在遍历树的每个节点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个节点的左右子树的深度相差都不超过1,按照定义就是一棵平衡的二叉树。
代码为:

bool IsBalanced(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
         return false;
    int left=TreeDepth(pRoot->m_pLeft);
    int right=TreeDepth(pRoot->m_pRight);
    int diff=left-right;
    if(diff>1||diff<-1)
       return false;
    return IsBalanced(pRoot->m_pLeft)&& IsBalanced(pRoot->m_pRight);;
}

int TreeDepth(BinaryTreeNode* pRoot)
{
   if(pRoot==NULL)
       return 0;
   int nLeft=TreeDepth(pRoot->m_pLeft);
   int nRight=TreeDepth(pRoot->m_pRight);
   return (nLeft>nRight)?(nLeft+1):(nRight+1);
}
上面的方法有着重复遍历节点多次的缺点。

2. 解法二
    如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右子树。只要在遍历每个节点的时候记录了它的深度,我们就可以一边遍历一边判断每个节点是不是平衡的。
代码为:
bool IsBalanced(BinaryTreeNode* pRoot,int *depth)
{
    if(pRoot==NULL)
    {
        *depth=0;
        return true;
    }
    int left;
    int right;
    if(IsBalanced(pRoot->m_pLeft,&left) && IsBalanced(pRoot->m_pRight,&right))
    {
         int diff=left-right;
         if(diff<=1 && diff>=-1)
         {
             *pDepth=1+(left>right?left:right);
             return true;
         }
    }
   return false;
}

我们只需要给上面的函数传入二叉树的根节点及一个表示节点深度的整形变量即可:

bool IsBalanced(BinaryTreeNode* pRoot)
{
   int depth=0;
   return IsBalanced(pRoot,&depth);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值