二叉树的操作

(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;
}


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值