二叉树--判断一棵二叉树是否是平衡二叉树&&求一颗二叉树的镜像

判断一棵二叉树是否是平衡二叉树

平衡二叉树:此树中任意一个左右子树的高度差小于等于1
递归思路:

//求高度
size_t Height(BinaryTreeNode<T>* pRoot)
{
     if(pRoot == NULL)
          return 0;
     int LeftHeight = Height(pRoot->Left) + 1;
     int RightHeight = Height(pRoot->Right) + 1;
     return LeftHeight > RightRoot ? LeftHeight : RightHeight;
}

//对每个结点进行判断
bool IsBalance(BinaryTreeNode *pRoot)
{
     if(pRoot == NULL)
          return true;

     int leftHeight = Height(pRoot -> left);
     int  rightHeight = Height(pRoot -> right);
     int long = leftHeight - rightHeight;
     if(long <= 1 && long >= -1)
          return IsBalance(pRoot -> left)&&IsBalance(pRoot -> right);
     else
          return false;
}

求一颗二叉树的镜像

递归:
镜像就是左右子树互相交换,先交换此结点再交换此结点的左右孩子节点

void BinaryMirror(BinaryTreeNode<T>* pRoot)
{
          if(pRoot != NULL)
          {
               std::swap(pRoot -> left,pRoot -> right);
               BinaryMirror(pRoot -> left);
               BinaryMirror(pRoot -> right);
          }
}

非递归:
利用队列/栈实现

用队列:

//镜像 非递归 队列
//左右交换即可
BinaryTreeNode <T >* _BinaryMirror_Nor_q (BinaryTreeNode <T >* pRoot )
{
         if ( pRoot == NULL)
                 return NULL;
         queue< BinaryTreeNode <T >*>q ;
                 q. push( pRoot);
         while (! q. empty())
         {
                     BinaryTreeNode <T >* pCur = q .front ();
                     std:: swap( pCur-> _pLeftChild, pCur-> _pRightChild);
                     q. pop();
                     if ( pCur-> _pLeftChild)
                           q. push( pCur-> _pLeftChild);
                     if ( pCur-> _pRightChild)
                           q. push( pCur-> _pRightChild);
         }
       return pRoot;
 }

用栈:思想和队列一样 都是左右交换 这里不存在什么先压左还是先压右的问题 因为就是结点子节点的左右交换

BinaryTreeNode <T >* _BinaryMirror_Nor_s (BinaryTreeNode <T >* pRoot )
{
         if ( pRoot == NULL)
                 return NULL;
         stack< BinaryTreeNode <T >*>s ;
                 s. push( pRoot);
         while (! s. empty())
         {
                     BinaryTreeNode <T >* pCur = s .top ();
                     std:: swap( pCur-> _pLeftChild, pCur-> _pRightChild);
                     s. pop();
                     if ( pCur-> _pLeftChild)
                           s. push( pCur-> _pLeftChild);
                     if ( pCur-> _pRightChild)
                           s. push( pCur-> _pRightChild);
         }
       return pRoot;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值