二叉树的基本操作
#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