各路英雄好汉请注意!哪位高手会用C语言编写树的建立和遍历?

2025-02-25 12:02:37
推荐回答(1个)
回答1:

#include
#include
#include
#include
#include
using namespace std;
///////////////////////////////////////////////////////////////////////////////////////////
#define MAXSIZE 20
///////////////////////////////////////////////////////////////////////////////////////////
typedef struct BiTree //二叉树结构体定义
{
char date; //节点值
struct BiTree *lchild; //左字树指针
struct BiTree *rchild; //右字树指针
}BitNode,*BitTree;
///////////////////////////////////////////////////////////////////////////////////////////
typedef struct
{
BitTree data[MAXSIZE]; //堆栈结构体定义
int top; //存储二叉树的指针
}SeqStack;
///////////////////////////////////////////////////////////////////////////////////////////
typedef struct
{
BitTree data[MAXSIZE]; //队列结构体定义
int front, rear; //存储二叉树的指针
}Queue;
///////////////////////////////////////////////////////////////////////////////////////////
void InitQueue(Queue &q) //初始化队列函数
{
q.front=0; //采用数组连续存储
q.rear=0;
}
///////////////////////////////////////////////////////////////////////////////////////////
void InsqQueue(Queue &q,BitTree T) //入队函数
{
q.rear++;
q.data[q.rear]= T;
}
///////////////////////////////////////////////////////////////////////////////////////////
int EmptyQueue(Queue &q) //判断队列是否为空函数
{
if(q.rear==q.front)
return 1; //空则返回1,否则0
else
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
void OutsqQueue(Queue &q,BitTree &p) //出队函数
{
p=q.data[q.front+1];
q.front++;
}

///////////////////////////////////////////////////////////////////////////////////////////
int i = 0; //全局常量,用来对建立二叉树时读取字符数组
char ch[] = {"ABD##EJ###CF#I##G##"}; //二叉树结点数组表示

///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
int Empty_SeqStack(SeqStack *s) //判断栈空函数
{
if (s->top == -1) //top为-1时为空
return 1;
else
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
BitNode *Pop_SeqStack(SeqStack *s) //退栈函数
{
BitNode *p;
if(Empty_SeqStack ( s ) ) //调用判断栈空函数
return 0; //栈空不能出栈
else
{
p = s->data[s->top];
s->top--;
return p;
} //栈顶元素存入p,返回p
}
///////////////////////////////////////////////////////////////////////////////////////////////
int Push_SeqStack (SeqStack *s, BitNode *c) //压栈函数
{
if (s->top == MAXSIZE-1)
return 0; //栈满不能入栈
else
{
s->top++; //压栈
s->data[s->top] = c;
return 1;
}
}

////////////////////////////////////////////////////////////////////////////////////////////////
SeqStack *Init_SeqStack() // 栈的初始化函数
{
SeqStack *s; //定义栈指针
s = (SeqStack *)malloc(sizeof(SeqStack)); //分配存储空间
s->top = -1; //栈的初始top值为-1
return s;
}
////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
void CreatBiTree(BitTree &T) //采用递归方法建立二叉树函数
{
if(ch[i] == '#') //遇到#号指针为空
{
T = NULL;
++i;
}
else
{
T = (BitNode *)malloc(sizeof(BitNode)); //动态分配内存
T -> date = ch[i]; //负值
++i; //数组编号增1
CreatBiTree(T -> lchild); //建立左字树
CreatBiTree(T -> rchild); //建立右字树
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
void PostOrder(BitNode *T) //递归法后续遍历函数
{
if(T)
{
PostOrder(T -> lchild);
PostOrder(T -> rchild);
cout << T -> date << "\t";
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
void PreOrder(BitNode *T) //非递归前序遍历函数
{
BitNode *p;
p = T;
SeqStack *sk;
sk = Init_SeqStack(); //建立堆栈sk
while(p != NULL) //节点指针不为空循环
{
cout << p -> date; //输出结点值
if(p -> rchild != NULL)
Push_SeqStack(sk,p -> rchild); //右子树非空压栈
if(p -> lchild != NULL)
p = p -> lchild;
else
if(!Empty_SeqStack(sk)) //栈不空出栈
p = Pop_SeqStack(sk);
else
p = NULL; //负值空使循环结束
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
void TravelOrder(BitNode *T) //按层次遍历函数
{
Queue q;
InitQueue(q); //初始化队列
BitTree p,pl,pr;
p = T;
if(p)
InsqQueue(q,p); //指针非空入队
while(!EmptyQueue(q)) //队不空循环
{
OutsqQueue(q,p); //出队
cout << p -> date; //访问输出结点值
pl = p -> lchild; //指向左子树
pr = p -> rchild; //右子树
if(pl) //非空入队
InsqQueue(q,pl);
if(pr)
InsqQueue(q,pr);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
int get_choice() //提示函数显示程序功能
{
int choice;
cout << endl;
cout << "请选择遍历输出的方式:" << endl;
cout << "1前序遍历此二叉树";
cout <<"2为后序遍历此二叉树" << endl;
cout << "3为按层次遍历此二叉树";
cout << "4退出" << endl;
cin >> choice;
return choice;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void outchar() //原始二叉树表示函数
{
cout << "这是二叉树的形态" << endl;
cout << " "<< "A" << endl;
cout << " "<< "B" << " " << "C" << endl;
cout << " "<< "D" << " " << "E" <<" "<< "F" << " " <<"G" << endl;
cout << " "<< "\t" << "J" << "\t" << "I" << endl;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
int selection;
BitTree t;
CreatBiTree(t); //创建二叉树
outchar();
selection = get_choice(); //输出提示信息
while(selection != 4) //循环显示
{
if(selection == 1)
PreOrder(t); //选择1前序遍历
else
if(selection == 2) //选择2后序遍历
PostOrder(t);
else
if(selection == 3) //选择3层次遍历
TravelOrder(t);
selection = get_choice();
}
free(t);
//1.递归方法建立二叉树
//2.循环显示操作
// 2.1前序非递归遍历
// 2.2后序递归遍历
// 2.3按层次遍历
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

我同学的作业。。。