(1)采用下列方法之一建立二叉树的二叉链表:① 输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。② 已知二叉树的先序遍历序列和中序遍历序列,或者已知二叉树的中序遍历序列和后序遍历序列,建立二叉树的二叉链表。③ 将一棵二叉树的所有结点存储在一维数组中,虚结点用#表示,利用二叉树的性质5,建立二叉树的二叉链表。例如用数组a存储的二叉树的结点如下(0单元不用):(2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。(3)写出对用二叉链表存储的二叉树进行层次遍历算法。(4)求二叉树的所有叶子及结点总数。
#include<stdio.h>
#include<stdlib.h>
#define MAX 5//最大值
#define INIT 3 //要增加的空间大小
typedef struct BiNode{
char data;
BiNode *lchild;
BiNode *rchild;
}BiNode,*BiTree;//二叉树结点
typedef struct{ //存储二叉树的栈
BiTree *base;
int top;
int MAXsize;
}Seqstack;
typedef struct nodetype{//存储二叉树的队列
BiTree *data;
int front;
int rear;
}PQueue;
void CreateBiTree(BiTree &bt){//先序建立二叉树
char ch;
ch=getchar();
if(ch=='#')
bt=NULL;
else{
bt=(BiTree)malloc(sizeof(BiNode));
bt->data=ch;
CreateBiTree(bt->lchild);//递归
CreateBiTree(bt->rchild);
}
}
void init_Stack(Seqstack &s){//建栈操作
s.base=(BiTree *)malloc(MAX*sizeof(BiTree));
s.top=0;
s.MAXsize=MAX;
}
int Empty_stack(Seqstack s){//栈的判空操作
if(s.top==0){
return 1;
}
return 0;
}
void Push(Seqstack &s,BiTree e){//入栈操作
s.base[s.top++]=e;
}
BiTree GetTop(Seqstack s,BiTree &e){//取栈顶元素
e=s.base[s.top-1];
return e;
}
BiTree Pop(Seqstack &s,BiTree &e){//出栈操作
if(s.top==s.MAXsize)
return 0;
e=s.base[s.top-1];
s.top--;
return e;
}
void Init_Queue(PQueue &q){//建队列
q.data=(BiTree *)malloc(sizeof(BiTree));
q.front=q.rear=0;
}
int QueueEmpty(PQueue q){//队列的判空
if(q.front==q.rear)
return 1;
return 0;
}
void EnQueue(PQueue &q,BiTree e){//入队列
q.data[q.rear]=e;
q.rear++;
}
void DeQueue(PQueue &q,BiTree &e){//出队列
e=q.data[q.front];
q.front++;
}
void visit(char a){//访问
printf("%c ",a);
}
//先序递归
void PreOrder_l(BiTree bt){
if(bt){
visit(bt->data);
PreOrder_l(bt->lchild);
PreOrder_l(bt->rchild);
}
}
//先序非递归
void PreOrder(BiTree bt){
BiTree p;
Seqstack s;
init_Stack(s);
if(bt){
Push(s,bt);
while(!Empty_stack(s)){
while(GetTop(s,p)&&p){
visit(p->data);
Push(s,p->lchild);
}
Pop(s,p);
if(!Empty_stack(s)){
Pop(s,p);
Push(s,p->rchild);
}
}
}
}
//中序递归
void InOrder_l(BiTree bt){
if(bt){
InOrder_l(bt->lchild);
visit(bt->data);
InOrder_l(bt->rchild);
}
}
//中序非递归
void InOrder(BiTree bt){
BiTree p;
Seqstack s;
if(bt){
init_Stack(s);
Push(s,bt);
while(!Empty_stack(s)){
while(GetTop(s,p)&&p){
Push(s,p->lchild);
}
Pop(s,p);
if(!Empty_stack(s)){
Pop(s,p);
Push(s,p->rchild);
visit(p->data);
}
}
}
}
//后序递归
void PostOrder_l(BiTree bt){
if(bt){
PostOrder_l(bt->lchild);
PostOrder_l(bt->rchild);
visit(bt->data);
}
}
//后序非递归
void PostOrder(BiTree bt){
BiTree p,q;
Seqstack s;
if(bt){
init_Stack(s);
Push(s,bt);
while(!Empty_stack(s)){
while(GetTop(s,p)&&p){
Push(s,p->lchild);
}
Pop(s,p);
if(!Empty_stack(s)){
GetTop(s,p);
if(p->rchild){
Push(s,p->rchild);
}
else{
Pop(s,p);
visit(p->data);
while(!Empty_stack(s) && GetTop(s,q) && q->rchild==p){
Pop(s,p);
visit(p->data);
}
if(!Empty_stack(s)){
GetTop(s,p);
Push(s,p->rchild);
}
}//else
}//if
}//while
}//if
}
//层次遍历
void LevelOrder(BiTree bt){
PQueue Q;
BiTree p;
if(bt){
Init_Queue(Q);
EnQueue(Q,bt);
while(!QueueEmpty(Q)){
DeQueue(Q,p);
visit(p->data);
if(p->lchild){
EnQueue(Q,p->lchild);
}
if(p->rchild){
EnQueue(Q,p->rchild);
}
}//while
}//if
}
//求二叉树的节点个数
void BiTreeNum(BiTree bt){
int i=0;
PQueue Q;
BiTree p;
if(bt){
Init_Queue(Q);
EnQueue(Q,bt);
while(!QueueEmpty(Q)){
DeQueue(Q,p);
i++;
if(p->lchild){
EnQueue(Q,p->lchild);
}
if(p->rchild){
EnQueue(Q,p->rchild);
}
}//while
}//if
printf("%d ",i);
}
//求二叉树的叶子个数
int LeafNUM(BiTree bt){
int i;
if(bt==NULL) i=0;
else
if(bt->lchild==NULL && bt->rchild==NULL)
i=1;
else
i=LeafNUM(bt->lchild)+LeafNUM(bt->rchild);
return i;
}
int main(){
BiTree bt;
CreateBiTree(bt);
printf("xian xv bian li:\n");
PreOrder_l(bt);
PreOrder(bt);
printf("zhong xv bian li:\n");
InOrder_l(bt);
InOrder(bt);
printf("hou xv bian li:\n");
PostOrder_l(bt);
PostOrder(bt);
printf("ceng ci bian li:\n");
LevelOrder(bt);
printf("%d个叶子\n",LeafNUM(bt));
BiTreeNum(bt);
return 0;
}