#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; }