判断二叉树是否平衡、是否完全二叉树、是否二叉排序树

//判断二叉树是否平衡
int isBalanced(Node* t)  
{ 
    if(t==NULL) return 1; 
    int leftDepth = TreeDepth(t->left); 
    int rightDepth = TreeDepth(t->right); 
    if(abs(leftDepth-rightDepth) > 1) 
        return 0; 
    else 
        return isBalanced(t->left) && isBalanced(t->right); 
}
//判断两棵二叉树是否相等
int CompTree(Node* tree1, Node* tree2)
{
    if(tree1==NULL && tree2==NULL)
        return 1;
    else if(tree1==NULL || tree2==NULL)
        return 0;
    if(tree1->data != tree2->data)
        return 0;
    if(CompTree(tree1->left,tree2->left)==1 && CompTree(tree1->right,tree2->right)==1)
        return 1;
    //反转二叉树也可能相等
    if(CompTree(tree1->left,tree2->right)==1 && CompTree(tree1->right,tree2->left)==1)
        return 1;
    return 0;
}
//拷贝二叉树
void CopyTree(Node* s,Node* & d)
{
     if(s==NULL) d = NULL;
     Node* temp = new Node;
     temp->data = s->data;
     if(d==NULL) d = temp;
     if(s->left) CopyTree(s->left,d->left);
     if(s->right) CopyTree(s->right,d->right);
}
//判断二叉树是否是完全二叉树:层次遍历二叉树,遍历的左右节点入队列。若出队列的结点为空,则以后出队列的结点都为空,则为完全二叉树,否则不是
int ComplateTree(Node* bt)
{
    Node* p=bt;
    queue<Node*> q;
    int tag=0;
    if(p==NULL) return 1;
    q.push(p);
    while(!q.empty())
    {
         p=q.front(); q.pop(); 
         if(p->left && !tag) q.push(p->left);
         else if(p->left)  return 0;
         else tag=1;
         if(p->right && !tag) q.push(p->right);
         else if(p->right)  return 0;
         else tag=1;
    }
    return 1;
}
//判断二叉树是否是二叉排序树(BST):根据中序遍历序列是否升序来判断 
bool IsBinarySortTree ( BinTree bt )
{
  InitStack(S);
  p = bt;  pre = 0;   // pre保持为p的中序前驱
  while ( p or ! StackEmpty(S) ) 
  {
    if ( p ) 
    {
      Push(S, p);
      p = p->lchild;
    } 
    else 
    {
      p = Pop(S);
      if ( pre and (p->data <= pre->data) )  return false;  // 不是二叉排序树
      pre = p;   // 记下前驱结点
      p = p->rchild;
    }
  }
  return true;  // 二叉排序树
}
//判断二叉树是否是二叉排序树(BST):层次遍历二叉树,若出队列的结点小于左结点的值,或者是大于右结点的值,则不是BST,否则是BST
bool IsBST(Node* T)
{
    Queue q;Node* p;
    if(T==NULL) return true;
    EnQueue(q,T);
    while(!empty(Q))
    {
        p=Dequeue(Q);
        if(p->left)
          if(p->data < p->left->data)
             return false;
          else EnQueue(Q,p->left);
        if(p->right)
          if(p->data > p->right->data)
             return false;
          else EnQueue(Q,p->right);
    }
    return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值