⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二叉排序树.cpp

📁 数据结构 二叉排序树 先序中序后序遍历 二叉树的查找
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

#define OK 1
#define ERROR 0
#define NULL 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 1024
#define STACKINCREMENT 10
#define CLS system("cls")
#define EXIT exit(0);

typedef struct BiTNode{
 int data;
 struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

struct node{
	struct BiTNode * a[100];
	int rear,front;
}Q;

typedef struct {
    BiTree * base;
    BiTree * top;
    int stacksize;
}SqStack;

void InitStack(SqStack &S){
	S.base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
    if(!S.base) exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;	
}
BiTree GetTop(SqStack S,BiTree &e){
    
    if(S.top==S.base) return ERROR;
      e=*(S.top-1);
      return e;
}
BiTree push(SqStack &S,BiTree e){
	if(S.top-S.base>=S.stacksize){
		S.base=(BiTree *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTNode));
		if(!S.base) exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return e;
}
BiTree pop(SqStack &S,BiTree &e){
       
	if(S.top==S.base) return ERROR;
	e=*--S.top;
	return e;
}

void CreateBitree(BiTree *T,int n){						/*插入二叉排序树结点*/
	if(!(*T)){
		(*T)=(BiTNode*)malloc(sizeof(BiTNode));
		(*T)->data = n;
		(*T)->lchild = NULL;
		(*T)->rchild = NULL;
		return;
	}
	else{		
		if((*T)->data==n)
			return;
		if(n>(*T)->data)
			CreateBitree(&(*T)->rchild,n);
		else
			CreateBitree(&(*T)->lchild,n);
	}
}

int PrintElement(int e){
	printf("%d ",e);
	return OK;
}

int PreOrder(BiTree T,int(*PrintElement)(int e)){								/*先序递归遍历*/
	if(T){
		if(PrintElement(T->data))
			if(PreOrder(T->lchild,PrintElement))
				if(PreOrder(T->rchild,PrintElement)) return OK;
		return ERROR;
	}
	else return OK;	
}

int MidOrder(BiTree T,int(*PrintElement)(int e)){								/*中序递归遍历*/
	if(T){
		if(MidOrder(T->lchild,PrintElement))
			if(PrintElement(T->data))
				if(MidOrder(T->rchild,PrintElement)) return OK;
		return ERROR;
	}
	else return OK;
}

void InOrder(BiTree T,int(*PrintElement)(int e)){								/*中序非递归遍历*/
	SqStack S;
	BiTree p;
	InitStack(S);push(S,T);
	while(S.base!=S.top){
		while(GetTop(S,p)&&p) push(S,p->lchild);
		p=pop(S,p);
		if(S.base!=S.top){
			pop(S,p);
			PrintElement(p->data);
			push(S,p->rchild);
		}
	}
	
}

int PostOrder(BiTree T,int(*PrintElement)(int e)){								/*后序递归遍历*/
	if(T){
		if(PostOrder(T->lchild,PrintElement))
			if(PostOrder(T->rchild,PrintElement))
				if(PrintElement(T->data)) return OK;
		return ERROR;
	}
	else return OK;
}

void LevelOrder(BiTree T,int(*PrintElement)(int e)){							/*层次遍历*/
	 Q.rear=Q.front=0;
	 if(T)
	 PrintElement(T->data);
	 Q.a[Q.rear]=T;
     Q.rear=Q.rear+1;
	 while(Q.rear>Q.front){
		 T=Q.a[Q.front];
         Q.front++;
		 if(T->lchild){
			 PrintElement(T->lchild->data);
			 Q.a[Q.rear]=T->lchild;
			 Q.rear++;
		 }
		 if(T->rchild){
			PrintElement(T->rchild->data);
			Q.a[Q.rear]=T->rchild;
			Q.rear++;
		 }
	}
}

void SearchBitree(BiTree T,int key,BiTree f,BiTree &p){							/*查找关键字*/
	if(!T){
		p=f;
		printf("没有这个数据\n");
	}
	else if(key==T->data){
		p=T;
		printf("这个数据在树中\n");
	}
	else if(key<T->data) 
		SearchBitree(T->lchild,key,T,p);
	else
		SearchBitree(T->rchild,key,T,p);
}

void ExchangeBitree(BiTree &T){													/*交换左右子树*/
    BiTree U;
	if (T) {
       ExchangeBitree(T->lchild);
       ExchangeBitree(T->rchild);
       U=T->lchild;
	   T->lchild=T->rchild;
	   T->rchild=U;
    }
}

int DepthBitree(BiTree T){														/*二叉排序树的深度*/
	int d,dl,dr;
	if(T!=NULL){
		dl=DepthBitree(T->lchild);
		dr=DepthBitree(T->rchild);
		if(dl>dr)
			d=dl;
		else
			d=dr;
		return (d+1);
	}
	else
		return (0);
}
		
int CLeafBitree(BiTree T){														/*二叉排序树的叶子结点数*/
	int c,n;
	if(!T) return (0);                      
    else if(T->lchild==NULL&&T->rchild==NULL)
		return (1);
	else {
		c=CLeafBitree(T->lchild);
		n=CLeafBitree(T->rchild);
		return (c+n);
	}
}

void main(){
	BiTree G=NULL;
loop:printf("********************************************************************************");
	printf("*                                                                              *");
    printf("*                                二叉排序树                                    *");
	printf("*                                                                              *");
	printf("*                          1. 建立一棵二叉排序树                               *");
	printf("*                          2. 插入一个结点                                     *");
    printf("*                          3. 先序递归遍历                                     *");
	printf("*                          4. 中序递归遍历                                     *");
    printf("*                          5. 中序非递归遍历                                   *");
	printf("*                          6. 后序递归遍历                                     *");
	printf("*                          7. 层次遍历                                         *");
    printf("*                          8. 查找数据                                         *");
    printf("*                          9. 交换左右子树                                     *");
    printf("*                          10. 二叉排序树的深度                                *");
	printf("*                          11. 二叉排序树的叶子结点数                          *");
    printf("*                          0. 退出                                             *");
    printf("*                                                                              *");
	printf("*                                                                              *");
	printf("*                                                                              *");
    printf("********************************************************************************");
	printf("\n");
	printf("请输入功能号: ");
	int x;
input:scanf("%d",&x);
	switch(x){
		case 0: EXIT;break;
		case 1:{
					CLS;
					int j,k;
					printf("请输入数据,若全部输入结束,请输入00:\n");
					for(j=1; ;j++){
						scanf("%d",&k);
						if(k==00){
							printf("输入结束\n");
							CLS;
							goto loop;
						}
						else
							CreateBitree(&G,k);
					}  
				}break;
		case 2: CLS;printf("\n");int z;printf("插入一个结点: ");scanf("%d",&z);CreateBitree(&G,z);printf("\n");printf("\n");goto loop;break;
		case 3: CLS;printf("\n");printf("先序递归遍历: ");PreOrder(G,PrintElement);printf("\n");printf("\n");goto loop;break;
		case 4: CLS;printf("\n");printf("中序递归遍历: ");MidOrder(G,PrintElement);printf("\n");printf("\n");goto loop;break;
		case 5: CLS;printf("\n");printf("中序非递归遍历: ");InOrder(G,PrintElement);printf("\n");printf("\n");goto loop;break;
		case 6: CLS;printf("\n");printf("后序递归遍历: ");PostOrder(G,PrintElement);printf("\n");printf("\n");goto loop;break;
		case 7: CLS;printf("\n");printf("层次遍历: ");LevelOrder(G,PrintElement);printf("\n");printf("\n");goto loop;break;
		case 8: CLS;printf("\n");int f;BiTree M,A;printf("输入要查找的数据: ");scanf("%d",&f);printf("\n");SearchBitree(G,f,M,A);printf("\n");printf("\n");goto loop;break;
		case 9: CLS;printf("\n");printf("交换成功!\n");ExchangeBitree(G);printf("\n");printf("\n");goto loop;break;
		case 10: CLS;printf("\n");printf("二叉排序树的深度是: %d",DepthBitree(G));printf("\n");printf("\n");goto loop;break;
		case 11: CLS;printf("\n");printf("二叉排序树的叶子结点数是: %d",CLeafBitree(G));printf("\n");printf("\n");goto loop;break;
		default : printf("输入错误,请重新输入: ");goto input;
	}
}


						












	


	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	


			




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -