二叉树

#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"
#define STACK_INIT_SIZE 5
#define STACKINCREMENT 1
#define OK 1
#define NULL 0
using namespace std; 
typedef struct {
char *base;
char *top;
int stacksize;
}SqStack;
SqStack S;
typedef struct BitNode{
int date;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
BiTree T;
int InitStack(SqStack &S)
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base) exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack &S,char e){
if(S.top-S.base>=S.stacksize)
{
   S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
   if(!S.base) exit(0);
   S.top=S.base+S.stacksize;
   S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Pop(SqStack &S,char &e)
{
e=*--S.top;
return OK;
}
int createbitree(BiTree &T)
{
int ch;
scanf("%d",&ch);
getchar();
if(ch==' ')T=NULL;
    else
{
   if(!(T=(BitNode *)malloc(sizeof(BitNode))))exit(0);
        T->date=ch;
   createbitree(T->lchild);
   createbitree(T->rchild);
}
    return OK;
}
int preordertraverse(BiTree T)
{
if(T){
   printf("%d\n",T->date);
   if(T->lchild)
    preordertraverse(T->lchild);
   preordertraverse(T->rchild);
   return OK;
   }
   printf("\n");
}
int inordertraverse(BiTree &T,char e)
{
int base,top;
BiTree a[100];
BiTree P;
P=T;
base=0;top=0;
while(P||a[top]!=a[base])
{
   if(P) 
   {
    a[top]=P;
    top++;
    P=P->lchild;
   }
   else
   {
    P=a[--top];
    printf("%d\n",P->date);
    if((P->date)==NULL)return 0;
      P=P->rchild;
   }
}
printf("\n");
return 1;
}
int backordertraverse(BiTree &T,char e)
{
int base,top;
BiTree a[100];
BiTree P,Q;
P=T;
base=0;top=0;
while(P||a[top]!=a[base])
{
   if(P) 
   {
    a[top]=P;
    top++;
    if(P->lchild) P=P->lchild;
    else P=P->rchild;
   }
   else
   {
    P=a[--top];
    printf("%d\n",P->date);
    P=a[--top];
    P=P->rchild;
   }
}
return 1;
}
void creattree(BiTree &T)                         /*生成二叉排序树*/
{
BiTree p,q; 
int x,i;
T=NULL;
printf("input integers(end by -1):\n");           /*提示录入-1结束生成过程*/
scanf("%d",&x);
while (x!=-1)
{ 
   q=(BitNode *)malloc(sizeof(BitNode));       /*申请新结点并赋值*/
      q->date=x;
      q->lchild=NULL;                             /*新结点总是作叶子*/
      q->rchild=NULL; 
     if (T==NULL)T=q;                          /*如果是空树,第一个结点作树根*/
        else
   {     
    p=T;
            i=1;                                  /*设置一个标志,识别结点是否完成插入*/
            while (i)
    {
              if (x<p->date)
     {
     if(p->lchild!=NULL) p=p->lchild;
     else{p->lchild=q;i=0;}
     }
                 else
     {
                    if(p->rchild!=NULL)p=p->rchild;
               else{p->rchild=q;i=0;}
     }
    }
   }
                 
      scanf("%d",&x);
   }       
}
int search(BiTree T,int key)
{
int base,top,j;
int k;
BiTree a[100];
BiTree P;
P=T;
base=0;top=0;j=0;
if(P) 
{ 
   a[top]=P;
   top++;
    while(P||a[top]!=a[base])
   { 
    if(j>=top)break;
     if(P->lchild&&!P->rchild)
    {
       a[top]=P->lchild;
         top++;
                P=a[j+1];j++;
    }
    if(!P->lchild&&P->rchild)
     {
          a[top]=P->rchild;
          top++; P=a[j+1];j++;
     }
    if(P->lchild&&P->rchild)
     {
          a[top]=P->lchild;
          top++;
      a[top]=P->rchild;
          top++;
      P=a[j+1];j++;
     }
    if(!P->lchild&&!P->rchild)
    {P=a[j+1];j++;}
   }
        while(a[base]!=a[top])
   {
    P=a[base];
    if(key==P->date)printf("所查找的关键字在第%d个结点",base);
      base++;
   }
}
else printf("error!");
printf("\n");
return 1;
}
int cctraver(BiTree T)
{
    int base,top,j;
int k;
BiTree a[100];
BiTree P;
P=T;
base=0;top=0;j=0;
if(P) 
{ 
   a[top]=P;
   top++;
    while(P||a[top]!=a[base])
   { 
    if(j>=top)break;
     if(P->lchild&&!P->rchild)
    {
       a[top]=P->lchild;
         top++;
                P=a[j+1];j++;
    }
    if(!P->lchild&&P->rchild)
     {
          a[top]=P->rchild;
          top++; P=a[j+1];j++;
     }
    if(P->lchild&&P->rchild)
     {
          a[top]=P->lchild;
          top++;
      a[top]=P->rchild;
          top++;
      P=a[j+1];j++;
     }
    if(!P->lchild&&!P->rchild)
    {P=a[j+1];j++;}
   }
        while(a[base]!=a[top])
   {
    P=a[base];
    printf("%d\n",P->date);
      base++;
   }
}
else printf("error!");
printf("\n");
return 1;
}
void main()
{
char e,k;
int t;
while(1)
{
   printf("1.建一棵空树\n");
   printf("2.生成二叉排序树\n");
   printf("3.前序遍历\n");
   printf("4.中序遍历\n");
        printf("5.后序遍历\n");
   printf("6.层次遍历二叉树\n");
   printf("7.在二叉树中查找给定关键字\n");
   printf("0.退出\n");
   printf("请选择:");
        scanf("%s",&k);
   getchar();
   switch(k)
   {
   case'1': createbitree(T);break;
   case'2': creattree(T);break;
   case'3': preordertraverse(T);break;
   case'4': inordertraverse(T,k);break;
   case'5': backordertraverse(T,k);break;
   case'6': cctraver(T);break;
   case'7': 
         printf("输入要查找的关键字:");
      scanf("%d",&t);
         search(T,t);break;
   case'0':break;
   }
   if(k=='0')break;
}
}


 二叉排序树

/*二叉排序树建立和删除
??对删除的操作还有点模糊 
Wpl
08,04,14*/
#include <iostream>
using namespace std;
typedef struct node
{
 int key;
 struct node *Lchild,*Rchild;
}BSTNode;
typedef BSTNode *BSTree;
BSTree InsertBST(BSTree Tptr,int key)
{
 BSTree f,p=Tptr;
 while(p)
 {
  if(p->key==key) //不插入重复数字(关键字) 
   return Tptr;
  f=p;   //f记录的是要插入的节点的父结点 
  p=(key<p->key)?p->Lchild:p->Rchild;
 }
 p=new BSTNode;
 p->key=key;
 p->Lchild=p->Rchild=NULL;
 if(Tptr==NULL)//如果本来是空树 
  Tptr=p;
 else  //原数中已有节点,则将p当作f的左孩子或者右孩子插入 
 {
  if(key<f->key)
   f->Lchild=p;
  else
   f->Rchild=p; 
 }
 return Tptr;  //将树的根节点还返回 
} 
BSTree CreateBST()//建立二叉排序树 
{
 BSTree T=NULL;
 int key;
 cout<<"输入元素:"<<endl;
 while(1)
 {
  cin>>key;
  if(key==0) //默认不插入关键值是0的节点 
   break;
  T=InsertBST(T,key); //调用插入函数进行插入 
 }
 return T;
}
int In_order(BSTree root) //递归中序遍历 
{
 if(root!=NULL)
 {
  In_order(root->Lchild);
  cout<<root->key<<"  ";
  In_order(root->Rchild);
  return 1;  //遍历成功返回1 
 } 
 return 0;//遍历失败返回0 
}
void DelBSTNode(BSTree Tptr, int key) //删除关键字值是key的节点 
{
 BSTree parent=NULL,p=Tptr,q,child;
 while(p)
 {
  if(p->key==key)  //找到 
   break;
  parent=p;
  p=(key<p->key)?p->Lchild:p->Rchild; 
 }
 if(!p)   //走了一条从根到叶子到路径依然没有找到key则证明不存在此关键字值的结点 
 {
  cout<<"不存在要删除结点"<<endl;
  return; 
 }
 q=p;
 if(q->Lchild&&q->Rchild) //
  for(parent=q,p=q->Rchild;p->Lchild;parent=p,p=p->Lchild);
 //q的中序遍历后继p是一定是q的右子树的最左下的结点 
 child=(p->Lchild)?p->Lchild:p->Rchild;
 if(parent==NULL)
  Tptr=child;
 else
 {
  if(p==parent->Lchild)
   parent->Lchild=child;
  else
   parent->Rchild=child;
  if(p!=q)
   q->key=p->key;
 }
}
int main()
{
 int key;
 BSTree root=NULL;
 root=CreateBST();   //建立二叉排序树
 if(In_order(root)==0)
  cout<<"这是一棵空树"<<endl;
 cout<<endl;
 cout<<"输入你要删除的节点:"<<endl;
 cin>>key;
 DelBSTNode(root,key);
 if(In_order(root)==0)
  cout<<"这是一棵空树"<<endl;
 cout<<endl;
 return 0; 
} 


 

你可能感兴趣的:(二叉树)