数据结构--树(c 代码部分)(王道书、考研适用)

一、结构体声明

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值