数据结构——二叉树的基本操作

二叉树的基本操作

在这里插入图片描述

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define True 1;
#define False 0;
#define STACK_INIT_SISE 100
#define STACKINCREMENT 10
using namespace std;

typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree ElemType;
typedef struct QNode{
	ElemType data;
	struct QNode *next;
}QNode,*QueuePtr; 
typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
typedef struct {
	ElemType *base;
	ElemType *top;
	int stacksize;
}SqStack;

//栈
void InitStack(SqStack &S){//初始化为空栈 
	S.base=(ElemType *)malloc(STACK_INIT_SISE*sizeof(ElemType));
	S.top=S.base;
	S.stacksize=STACK_INIT_SISE;
}
void DestroyStack(SqStack &S){//销毁栈
	free(S.base);
	S.base=NULL;
	S.stacksize=0;
}

int ClearStack(SqStack &S){//将栈置空
	S.stacksize=0;
	if(S.stacksize==0)
	return 1;
	return 0;
}

int StackEmpty(SqStack S){//判断栈是否为空
	if(S.top==S.base)
	return 1;
	return 0;
}

int StackLength(SqStack S){//返回栈的长度
	return (S.top-S.base);
}

int GetTop(SqStack S,ElemType &e){//求栈顶元素
	if(S.top==S.base)
	return 0;
	e=*(S.top-1);
	return 1;
}

void Push(SqStack &S,ElemType e){//插入元素,并使其成为栈顶元素
	if(S.top-S.base>=S.stacksize){
		S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
	S.top=S.base+S.stacksize;
	S.stacksize+=STACKINCREMENT;
	}
	*S.top=e;
	S.top++;
	
}

void Pop(SqStack &S,ElemType &e){//删除栈顶元素,并返回其值
	S.top--;
	e=*S.top;
}
//栈 

//队列 
void InitQueue(LinkQueue &Q){//初始化队列
	Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
	Q.front->next=NULL;
}

void DestroyQueue(LinkQueue &Q){//销毁队列
	while(Q.front){
		Q.rear=Q.front->next;
		free(Q.front);
		Q.front=Q.rear;
	}
}

int ClearQueue(LinkQueue &Q){//清空队列
	
	QueuePtr p=Q.front->next;
	while(p){
		Q.front->next=p->next;
		free(p);
		p=Q.front->next;
	}
	Q.front->data=0;
	Q.front->next=NULL;
	Q.rear=Q.front;
	if(Q.front->next==NULL)
	return 1;
	return 0;
}

int QueueEmpty(LinkQueue Q){//判断队列是否为空
	if(Q.front==Q.rear)
	return 1;
	return 0;
}

int QueueLength(LinkQueue Q){//返回队列中元素个数
	int n=0;
	while(Q.front!=Q.rear){
		Q.front=Q.front->next;
		n++;
	}
	return n;
}

int GetHead(LinkQueue Q,ElemType &e){//返回队列对头元素
	if(Q.rear==Q.front)
	return 0;
	QueuePtr p=Q.front->next;
	e=p->data;
	return 1;
}

void EnQueue(LinkQueue &Q,ElemType e){//插入新的队尾元素
	QueuePtr p;
	p=(QueuePtr)malloc(sizeof(QNode));
	
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
}

void DeQueue(LinkQueue &Q,ElemType &e){//删除对头元素
	
	QueuePtr p=Q.front->next;
	e=p->data; 
	Q.front->next=p->next;
	if(p==Q.rear)
	Q.rear=Q.front;
	free(p);
} 

Status CreateBiTree(BiTree &T)//先序创建二叉树 
{
	char n;
	cin>>n;
	if(n=='#')
	{
		T=NULL;
	}
	else
	{
		T=(BiTree)malloc(sizeof(BiTNode));
		T->data=n;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
	
	return True;
}

Status PreOrderTraverse(BiTree T)//递归先序遍历 
{
	if(T==NULL)
	{
		return False;
	}
	else{
		cout<<T->data<<endl;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

void InOrderTraverse_Stack(BiTree T){//非递归中序遍历 
	SqStack S;
	InitStack(S);
	BiTree p=T;
	while(p||(StackEmpty(S)!=1)){//p存在  或者 栈不空 
		if(p){
			Push(S,p);
			p=p->lchild;
		}
		else{
			Pop(S,p);
			cout<<p->data<<endl;;
			p=p->rchild;
		}
	}
} 

void InOrderTraverse_digui(BiTree T){
	SqStack S;
	InitStack(S);
	Push(S,T);
	BiTree p;
	while(StackEmpty(S)!=1){
		while(GetTop(S,p)!=0&&p){
			Push(S,p->lchild);
		}
		Pop(S,p);
		if(StackEmpty(S)!=1){
			Pop(S,p);
			cout<<p->data;
			Push(S,p->rchild);
		} 
	}
} 

void PostOrderTraverse(BiTree T){//递归后序遍历 
	if(T==NULL)
	return;
	else{ 
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout<<T->data<<endl;;
	}
}

void LevelOrderTraverse(BiTree T){//层序遍历 
	BiTree p=T; 
	LinkQueue Q;
	InitQueue(Q);
	EnQueue(Q,p);
	while(QueueEmpty(Q)!=1){//循环条件:Q不为空 
		DeQueue(Q,p);//弹出对头元素 存放在p中 
		cout<<p->data<<endl;; 
		if(p->lchild!=NULL)
		EnQueue(Q,p->lchild);
		if(p->rchild!=NULL)
		EnQueue(Q,p->rchild);
	}
}

int TreeDeep(BiTree T){//深度 
	int deep=0;
	if(T){
		int ldeep=TreeDeep(T->lchild);
		int rdeep=TreeDeep(T->rchild);
		deep=ldeep>=rdeep?ldeep+1:rdeep+1;
	}
	return deep;
} 


int main()
{
	while(1)
	{
	BiTree T;
	cout<<endl;
	cout<<"***********************"<<endl;
	cout<<"1.创建二叉树"<<endl;
	cout<<"2.先序遍历二叉树"<<endl;
	cout<<"3.中序遍历二叉树1"<<endl;	 
	cout<<"4.中序遍历二叉树2"<<endl;
	cout<<"5.后序遍历二叉树"<<endl;
	cout<<"6.层序遍历二叉树"<<endl;
	cout<<"7.求二叉树的深度"<<endl;
	cout<<"8.退出"<<endl;
	cout<<"***********************"<<endl;
	cout<<"请选择"<<endl;
	int choose=0;
	cin>>choose;
	switch(choose){
		case 1:
			{
				cout<<"请输入结点的数值域(一个字符):"<<endl;
				cout<<"当输入#时表示这个结点不存在"<<endl;
				CreateBiTree(T);
				cout<<"创建成功"<<endl;
				break;
			}
		case 2: 
		{
			PreOrderTraverse(T);
			break; 
		}
		case 3:
		{
			InOrderTraverse_Stack(T);
			break;	
		} 
		case 4:{
				InOrderTraverse_digui(T);
				break;
		}
		case 5:{
			PostOrderTraverse(T);
			break;
		}
		case 6:{
				LevelOrderTraverse(T);
				break;
			}
			case 7:{
				cout<<TreeDeep(T)<<endl;;
				break;
			}
			
			case 0:{
				 
				break;
			}
			default:{
				cout<<"请输入有效的操作!"<<endl;
				break;
			}
	}
	} 
}

特别注意:
仅供参考学习,转载请附上原文链接
分享学习心得,如有侵权,望联系本人处理
还在读大学的程序员,项目经验少,如有纰漏,感谢指正
需要源代码请联系本人
谢谢配合

如果这篇文章对您有帮助,小小的点个赞,算是给小学弟的鼓励吧!谢谢大佬!!/呱呱.jpg

发布了48 篇原创文章 · 获赞 35 · 访问量 4991

猜你喜欢

转载自blog.csdn.net/qq_44749053/article/details/103460288