二叉树相关操作(二)

1.判断两棵二叉树是否相似(不考虑节点数据)

int Similar(BiTree T1,BiTree T2){
    int left,right;
    if(T1==NULL&&T2==NULL){
       return 1;      //均为空树 相似
  }else if(T1==NULL||T2==NULL){
          return 0;   //一棵为空一棵不为空,不相似
       }else { //均不为空树
           left=Similar(T1->lchild,T2->lchild);
           right=Similar(T1->rchild,T2->rchild);  
         return left&&right; //left和right均为1时(两棵树相似)返回1
     }
}

2.删除二叉树中 根结点 值为x 的子树

1)查找节点为x的节点

2)删除以该节点为根的子树

//删除根节点为x的子树
int  DeleteTree(BiTree T){
      if(T!=NULL){
         DeleteTree(T->lchild);
         DeleteTree(T->rchild);
         free(T);
    }
}

void Search(BiTree &T,ElemType x){ //查找节点值为x的节点
   if(T==NULL){
        return;//树为空
    }
   if(T-data==x){   //根节点为x,删除整棵树
       DeleteTree(T);
       return;
     }

       Queue Q;
       InitQueue(Q);
       BiTree *p=T;
       EnQueue(Q,p);
       while(Q!=NULL){
          DeQueue(Q,p);
        }
      if(p->lchild==x) {//若左孩子等于x,删除此子树
              DeleteTree(p);
          }else
      if(p->rchild==x){
              DeleteTree(P);
         }else{               //左右子树都不为x,继续遍历查找
           Search(p->lchild,x);
           Search(p->rchild,x);
    }
}

3.非递归求二叉树的深度

int DeepTree(BiTree T){
     if(T==NULL){
         return 0;
     }
     int h=0,last=0;
     BiTree *Q[MaxSize];
     int front=-1,rear=-1;
     BiTree *p=T;

     rear++;   
     Q(rear)=p; //根节点入队 也可写为Q(++rear)=p;

     while(front<rear){ //队不为空
            front++;     //元素出队,每出队一个元素 front指针后移一位
            p=Q[front];
            if(p->lchild){
                 rear++;
                 Q[rear]=p->child;
             }
            if(p->rchild){
                 rear++;
                  Q[rear]=p-rchild;
             }
            if(front==last){    //front等于每一层最后一个节点时,高度增加 
                   h++;  
                   last=rear;   //last指向尾指针(重新指向下一层最后一个节点)
             }
      }
    return h;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucky77.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值