一、结构体声明
1.二叉树的结构体定义
//树结构体定义
typedef char BiElemType;
typedef struct BiTNode{
BiElemType c;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
2.栈,循环队列,链式队列
// 辅助队列结构体定义
typedef struct tag{
BiTree p;
struct tag *pnext;
}tag_t,*ptag_t;
// 栈结构体定义
#define MaxSize 100
typedef BiTree elemtype; //栈队列数组指针
typedef struct{
elemtype data[MaxSize];
int top; //指向栈顶元素
}SqStack;//sequence 顺序
//abcdefghigk
//循环队列结构体定义
#define Maxsize 10
typedef struct {
elemtype data[Maxsize];
int front, rear;
int tag;
}SqQueue;
3、循环队列代码
//循环队列
void InitQueue(SqQueue &Q) {
Q.rear = Q.front = 0;
}
bool QueueEmpty(SqQueue Q) { //队列判空
if (Q.rear == Q.front) return true;
else return false;
}
bool EnQueue(SqQueue& Q, elemtype x) {
if ((Q.rear+1)%Maxsize == Q.front) return false;
Q.data[Q.rear] = x;
//循环队列
Q.rear = (Q.rear + 1) % Maxsize;
return true;
}
bool DeQueue(SqQueue& Q, elemtype &x) {
if (Q.rear == Q.front) return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % Maxsize; return true;
}
bool GetHead(SqQueue& Q, elemtype &x) {
if (Q.rear == Q.front) return false;
x = Q.data[Q.front];
return true;
}
4.栈代码
//s.top == -1 栈
void InitStack(SqStack &S){
S.top = -1;
}
bool StackEmpty(SqStack S){
if(S.top==-1) return true; //栈空
else return false; //不空
}
bool Push(SqStack &S,elemtype x){
if(S.top==MaxSize-1) return false;
S.data[++S.top] = x;
return true;
}
bool Pop(SqStack &S,elemtype &x){
if(S.top==-1) return false;
x = S.data[S.top--]; return true;
}
bool GetTop(SqStack S,elemtype &x){
if(S.top==-1) return false;
x = S.data[S.top]; return true;
}
二、二叉树的遍历
1.先序遍历
void PreOrder(BiTree p){ //深度优先遍历
if(p!=NULL){
cout<<p->c<<" ";
PreOrder(p->lchild); //打印左子树
PreOrder(p->rchild); //打印右子树
}
}
2.中序遍历
void InOrder(BiTree p){
if(p!=NULL){
InOrder(p->lchild);
cout<<p->c<<" ";
InOrder(p->rchild);
}
}
3.后序遍历
void PostOrder(BiTree p){
if(p!=NULL){
PostOrder(p->lchild);
PostOrder(p->rchild);
cout<<p->c<<" ";
}
}
4.非递归先序遍历
void PreOrder2(BiTree p,SqStack &S){
InitStack(S); BiTree r = p;
while(r || !StackEmpty(S) ){
if(r){
cout << r->c<< " ";
Push(S,r);
r = r->lchild;
}else {
Pop(S,r);
r = r->rchild;
}
}
}
5.非递归中序遍历
void InOrder2(BiTree p , SqStack &S