(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。
(1)建立二叉樹的二叉連結串列。
(2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。
(3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。
include<stdio.h>
#include<stdlib.h>
#define N 20
#define SIZE 100
#define MORE 10
typedef struct BiTNode{
char data; //資料域
struct BiTNode *lchild, *rchild; //左、右孩子指標
}BiTNode, *BiTree;
//棧
typedef struct{
BiTree *base;
int top;
int stacksize;
}SqStack;
//佇列
typedef struct {
BiTree *base; //初始化動態分配空間
int front;
int rear;
} SqQueue;
//棧
void InitStack(SqStack &S){
//構造一個空棧
S.base=(BiTree*)malloc(SIZE*sizeof(BiTree));
if(!S.base) return ;
S.top=0;
S.stacksize=SIZE;
}
int StackEmpty(SqStack &S){
//判空 是返回1 否返回0
if(S.top==0) return 1;
else return 0;
}
void Push(SqStack &S,BiTree e){
//入棧
if(S.top>=S.stacksize){
S.base=(BiTree *)realloc(S.base,(S.stacksize+MORE)*sizeof(BiTree));
if(!S.base) exit(0);
S.stacksize+=MORE;
}
S.base[S.top++]=e;
}
void Pop(SqStack &S,BiTree &e){
//出棧
if(S.top==0) exit(0);
else
e=S.base[--S.top];
}
int GetTop(SqStack &S,BiTree &e){
//取棧頂元素
if(S.top==0)
return 0;
else
e=S.base[S.top-1];
return 1;
}//棧
//佇列
void InitQueue(SqQueue &Q){
//構造一個空佇列
Q.base=(BiTree *)malloc(SIZE*sizeof(BiTree));
if (!Q.base) exit(0);
else
Q.front=Q.rear=0;
}
int QueueEmpty(SqQueue Q){
//判空
if (Q.rear==Q.front) return 1;
else
return 0;
}
void EnQueue(SqQueue &Q,BiTree e){
//插入元素e為Q的新的隊尾元素
if ((Q.rear+1)%SIZE==Q.front)
exit(0);
else
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%SIZE;
}
void DeQueue(SqQueue &Q,BiTree &e){
// 刪除Q的隊頭元素, 並用e返回其值
if ((Q.rear+1)%SIZE==Q.front)
exit(0);
else
e=Q.base[Q.front];
Q.front=(Q.front+1)%SIZE;
} //佇列
void visit(char data){
printf("%3c",data);
}
void CreatBiTree(BiTree &bt){
//構造二叉樹
char ch;
ch=getchar();
if(ch=='#')
bt=NULL;
else{
bt=(BiTree)malloc(sizeof(BiTNode));
bt->data=ch;
CreatBiTree(bt->lchild);
CreatBiTree(bt->rchild);
}
}
//二叉樹三種遍歷的遞迴演算法
void PreOrderTraverse(BiTree bt){
//先序遍歷
if(bt){
visit(bt->data);
PreOrderTraverse(bt->lchild);
PreOrderTraverse(bt->rchild);
}
}
void InOrderTraverse(BiTree bt){
//中序遍歷
if(bt){
InOrderTraverse(bt->lchild);
visit(bt->data);
InOrderTraverse(bt->rchild);
}
}
void PostOrderTraverse(BiTree bt){
//後序遍歷
if(bt){
PostOrderTraverse(bt->lchild);
PostOrderTraverse(bt->rchild);
visit(bt->data);
}
}
//二叉樹三種遍歷的非遞迴演算法,棧
void PreOrderTraverse2(BiTree bt){
//先序遍歷
BiTree p;
SqStack S;
if(bt){
InitStack(S);
Push(S,bt);
while(!StackEmpty(S)){
while(GetTop(S,p)&&p){
visit(p->data);
Push(S,p->lchild);
}
Pop(S,p);
if(!StackEmpty(S)){
Pop(S,p);
Push(S,p->rchild);
}
}
}
}
void InOrderTraverse2(BiTree bt){
//中序遍歷
BiTree p;
SqStack S;
if(bt){
InitStack(S);
Push(S, bt);
while(!StackEmpty(S)){
while(GetTop(S,p)&&p){
Push(S, p->lchild);
Pop(S, p);
}
if(!StackEmpty(S)){
Pop(S,p);
visit(p->data);
Push(S, p->rchild);
}
}
}
}
void PostOrderTraverse2(BiTree bt){
//後序遍歷
BiTree p,q;
SqStack S;
InitStack(S);
Push(S,bt);
while(!StackEmpty(S)){
while(GetTop(S,p)&&p){
Push(S,p->lchild);
Pop(S,p);
}
if(!StackEmpty(S)){
GetTop(S,p);
if(p->rchild)
Push(S,p->rchild);
else{
Pop(S,p);
visit(p->data);
while(!StackEmpty(S)&&GetTop(S,q)&&q->rchild==p){
Pop(S,p);
visit(p->data);
}
if(!StackEmpty(S)){
GetTop(S,p); Push(S,p->rchild);
}
}
}
}
}
void LevelOrderTraverse(BiTree bt){
//層次遍歷,佇列
BiTree p;
SqQueue Q;
if(bt){
InitQueue(Q);
EnQueue(Q,bt);
while(!QueueEmpty(Q)){
DeQueue(Q,p);
visit(bt->data);
if(p->lchild){
EnQueue(Q,p->lchild);
}
if(p->rchild){
EnQueue(Q,p->rchild);
}
}
}
}
int NodeNum(BiTree bt){
//求結點個數
int count=0;
BiTree p;
SqQueue Q;
if(bt){
InitQueue(Q);
EnQueue(Q,bt);
while(!QueueEmpty(Q)){
DeQueue(Q,p);
count++;
if(p->lchild){
EnQueue(Q,p->lchild);
}
if(p->rchild){
EnQueue(Q,p->rchild);
}
}
}
return count;
}
int LeaNum(BiTree bt){
//求葉子總數
if(!bt){
return 0;
}
else if(!(bt->lchild)&&!(bt->rchild)){
return 1;
}
else{
return (LeaNum(bt->lchild)+LeaNum(bt->rchild));
}
}
int main(){
int a,b;
BiTree bt;
printf("輸入資料:\n");
CreatBiTree(bt);
a=NodeNum(bt);
printf("結點個數為:%d\n",a);
b=LeaNum(bt);
printf("葉子個數為:%d\n",b);
return 0;
}