二叉树基本操作

#include<stdio.h>
#include"tree.h"
#include<stdlib.h>
#include"stack.h"
#include"queue.h"
#include<math.h>
Bitree CreateTree(Bitree p)//先序递归法建立二叉树
{
    char c;
    printf("input:");
    scanf("%c",&c);
    if(c=='#') p=NULL;
    else{
        p=(Bitree)malloc(sizeof(Binode));
        p->alp=c;
        getchar();
        p->lchild=CreateTree(p->lchild);
        getchar();
        p->rchild=CreateTree(p->rchild);
    }
    return p;
}
void Visit(Bitree p)
{
    printf("%c",p->alp);
}
void Preorder(Bitree p)//遍历的递归法
{
    if(p!=NULL){
        Visit(p);
        Preorder(p->lchild);
        Preorder(p->rchild);
                }
}
void Inorder(Bitree p)
{
    if(p!=NULL){
        Inorder(p->lchild);
        Visit(p);
        Inorder(p->rchild);
                }
}
void Postorder(Bitree p)
{

    if(p!=NULL){
        Postorder(p->lchild);
        Postorder(p->rchild);
        Visit(p);
                }
}
void InorderTravel(Bitree p)//遍历非递归算法:中序
{
    linkstack s;
    initstack(&s);
    Bitree t=p;
    while(!empstack(s)||t)
        {
      while(t){push(&s,t);t=t->lchild;}
           t=pop(&s);
           Visit(t);
           t=t->rchild;
          }
}
void PreorderTravel(Bitree p)//先序
{
     linkstack s;
    initstack(&s);
    Bitree t=p;
    while(!empstack(s)||t)
    {
        while(t){push(&s,t);Visit(gettopstack(s));t=t->lchild;}
         t=pop(&s);t=t->rchild;
    }
}
void PostorderTravel(Bitree p)//后序
{
    linkstack s;
    initstack(&s);
    Bitree t=p,l;
    l=NULL;
    while(!empstack(s)||t)
    {
        while(t) {push(&s,t);t=t->lchild;}
        t=gettopstack(s);
        t=t->rchild;
        if(!t||t==l){l=pop(&s);Visit(l);t=NULL;}
    }
}
void LevelTravel(const Bitree p)//层次遍历上下左右
{
    linkqueue q;
    initqueue(&q);
    Bitree t;
    if(!p) printf("empty tree");
    else
       { t=p;
        enqueue(&q,p);
         while(!empqueue(q)){
        t=dequeue(&q);Visit(t);
        if(t->lchild) enqueue(&q,t->lchild);
        if(t->rchild) enqueue(&q,t->rchild);
                      }
   }
}
void InvertLevel(Bitree p)//下上右左,在上面加个栈
{
   linkqueue q;
    initqueue(&q);
    linkstack s;
    initstack(&s);
    Bitree t;
    if(!p) printf("empty tree");
    else
   {  t=p;
       enqueue(&q,p);
       while(!empqueue(q)){
        t=dequeue(&q);push(&s,t);
        if(t->lchild) enqueue(&q,t->lchild);
        if(t->rchild) enqueue(&q,t->rchild);
                      }
   }
  while(!empstack(s)){t=pop(&s);Visit(t);}
}

void  BitreeDepWid(Bitree p)//求二叉树的深度和宽度的非递归算法
{
    linkqueue q;
    initqueue(&q);
    Bitree t,l;
    l=t=p;
    int n,dep,wid;
    n=dep=wid=0;
    if(p)
    {
       enqueue(&q,t);
    while(!empqueue(q)){
        t=dequeue(&q);n++;
        if(t->lchild) enqueue(&q,t->lchild);
        if(t->rchild) enqueue(&q,t->rchild);
        if(t==l) {
                 dep++;
                 //l=getbasequeue(q);
                 //l=q.rear->bt;此句当q.rear为空的时候会出问题,->指向何处??
                 if(q.rear) l=q.rear->bt;
                 if(n>wid) wid=n;
                 n=0;
                    }
            }
   }
   printf("dep=%d wid=%d\n",dep,wid);
}
int  Depth(Bitree p)//二叉树深度的递归算法
{
  if(!p) return 0;
 return (Depth(p->lchild)>Depth(p->rchild)?Depth(p->lchild):Depth(p->rchild))+1;

}
int  IsComplete(Bitree p)//判断是否完全二叉树
{
    linkqueue q;//声明对象时不用malloc声明指针时要malloc
    initqueue(&q);
    Bitree t=p;
    if(!p) return 1;
    else {
        enqueue(&q,t);
        while(!empqueue(q))
        {
            t=dequeue(&q);
            if(t){enqueue(&q,t->lchild);enqueue(&q,t->rchild);}
            else {
                while(!empqueue(q)){
                        t=dequeue(&q);
                       if(t) return 0;
                                    }
                   }
        }
       return 1;
    }
}
void Swapp(Bitree p)//交换左右子树
 {
     Bitree t=p;
     if(t) {
        t=p->lchild;
        p->lchild=p->rchild;
        p->rchild=t;
        Swapp(p->lchild);
        Swapp(p->rchild);
     }
 }
int  BiCount(Bitree p)//计算一颗树度为二的节点数的和:1.递归2.递归遍历
 {//先序的
     if(!p) return 0;
     else if(p->lchild&&p->rchild)
        return BiCount(p->lchild)+BiCount(p->rchild)+1;
     else
     return BiCount(p->lchild)+BiCount(p->rchild);
 }
void DeleteTree(Bitree p)//递归删除以p为根节点的树
{
    if(p){
    DeleteTree(p->lchild);
    DeleteTree(p->rchild);
    free(p);}
}

void BiDelx(Bitree p)//删除子树
{   char x;
    if(!p) printf("no element in the tree\n");
    else {
            getchar();
            printf("input x:");
            scanf("%c",&x);
        if(x==p->alp) DeleteTree(p);
       else {Bitree t=p;
        linkqueue q;
        initqueue(&q);
        enqueue(&q,t);
      while(!empqueue(q))
        {    t=dequeue(&q);
            if(t->lchild)
            {
               if(t->lchild->alp==x) {DeleteTree(t->lchild);t->lchild=NULL;}
                          else enqueue(&q,t->lchild);
            }
            if(t->rchild)
              {
            if(t->rchild->alp==x)  {DeleteTree(t->rchild);t->rchild=NULL;}
                         else enqueue(&q,t->rchild);
               }
      }
    }
  }
}

void SearchParent(Bitree p)//查找所有父节点
{
      getchar();
     char x;
   printf("input x:");
   scanf("%c",&x);
   linkstack s;
   initstack(&s);
   Bitree t,l;
   t=p;l=NULL;
   while(t||!empstack(s))
    {
        while(t&&t->alp!=x) {push(&s,t);t=t->lchild;}
      if(t)  if(t->alp==x) break;//如果不加if(t),t为空时t->alp会导致内存问题
    if(!t) {
        t=gettopstack(s);
        t=t->rchild;
       if(t&&t!=l){if(t->alp==x) break;}
       else {l=pop(&s);t=NULL;}
    }

  }
if(!empstack(s)) while(!empstack(s)){t=pop(&s);Visit(t);}
 else printf("not found");
}

Bitree BST_Insert(Bitree p,char x)//二叉排序树的插入均是在叶子节点上进行的
{
    Bitree t,l,k;
    t=(Bitree)malloc(sizeof(Binode));
    t->alp=x;
    t->lchild=t->rchild=NULL;
  if(!p) return t;
  else {  l=p;
        while(l)
      {    k=l;
        if(x<k->alp) l=k->lchild;
        else if(x>k->alp)  l=k->rchild;
        else {free(t);break;}
    }
      if(k->alp<x) k->rchild=t;
      if(k->alp>x)  k->lchild=t;
      return p;
       }
}
Bitree Create_BST()
{
    Bitree p;
    p=NULL;
   getchar();
   char ch;
   printf("input :");
 while((ch=getchar())!='#')
 {
     getchar();
    p=BST_Insert(p,ch);
     printf("input :");
 }
 return p;
}
/*
int Is_BST(Bitree p)//判断是否二叉排序树:1.非递归中序遍历2.层次遍历
{
   linkstack s;
   initstack(&s);
   Bitree t=p,l;
   l=NULL;
   while(t||!empstack(s))
   {
         while(t) {push(&s,t);t=t->lchild;}
         t=pop(&s);
         if(l&&t->alp<l->alp) return 0;
         l=t;
         t=t->rchild;
   }
 return 1;
}
*/
int Is_BST(Bitree p)//二叉排序树判定_层次遍历.利用队列
{
    linkqueue q;
    initqueue(&q);
    Bitree t;
    t=p;enqueue(&q,t);
    while(!empqueue(q))
    {
        t=dequeue(&q);
        if(t->lchild) {
           if(t->lchild->alp>t->alp) return 0;
          else  enqueue(&q,t->lchild);
                     }
        if(t->rchild) {
            if(t->rchild->alp<t->alp) return 0;
            else enqueue(&q,t->rchild);
                      }
    }
    return 1;
}

int Is_Balence(Bitree p)// 是否平衡二叉树
{
    if(p==NULL) return 1;
    int ldep=Depth(p->lchild);
    int rdep=Depth(p->rchild);
    if(abs(ldep-rdep)>1) return 0;
    else
return Is_Balence(p->lchild)&&Is_Balence(p->rchild);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值