二叉树的二叉链表示

#include<stdio.h>
#include<stack> 
#define MAXSIZE 100
using namespace std;

//---------二叉树的二叉链存储表示---------- 
typedef struct BiTNode{
	char data;//节点数据域 
	struct BiTNode *lchild, *rchild;//左右孩子指针 
}BiTNode, *BiTree;


//-----------------------------------------定义栈和栈的基本操作---------------------- 
//定义一个顺序栈,保存二叉树的结点 
typedef struct{
	struct BiTNode *base;//栈底指针
	struct BiTNode *top;//栈顶指针
	int stacksize;//栈的最大容量 
}SeqStack;

//初始化栈 
bool InitStack(SeqStack &S){
	S.base=new BiTNode[MAXSIZE];
	if(!S.base){
		return false;
	}
	S.base=S.top;
	S.stacksize=MAXSIZE;
	return true;
}

//栈是否为空 
bool IsEmptyStack(SeqStack &S){
	return S.top==S.base? true : false;
} 

//顺序栈入栈 
bool Push(SeqStack &S, BiTNode e){
	if(S.top-S.base==S.stacksize){
		return false;//栈满。入栈失败 
	}
	*S.top++=e;
	return true;
}

//出栈 
bool Pop(SeqStack &S, BiTNode &e){
	if(S.top==S.base){
		return false;
	}
	e=*--S.top;
	return true;
}

//取栈顶元素
void GetTopElem(SeqStack &S, BiTNode &e){
	if(S.top!=S.base){
		e= *(S.top-1);
	}
}

//-----------------------------------------------栈的操作完毕--------------------------- 

//-------------------------------------创建二叉树------------------------------------- 
//先序遍历的顺序创建二叉链表 ,输入:ABC##DE#G##F### 
void  CreateBiTree(BiTree &T){
	char ch;
	scanf("%c", &ch);
	if(ch=='#'){
		T=NULL;//递归结束,创建空树 
	}else{
		T=new BiTNode;
		T->data=ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	} 
} 

//------------------------------遍历二叉树------------------------- 
//中序遍历-递归 
void InOrderTraveTree(BiTree &T){
	if(T){
		InOrderTraveTree(T->lchild);
		printf("%c", T->data);
		InOrderTraveTree(T->rchild);
	}	
}

//中序遍历二叉树的非递归方法 
void InOrderTraverse2(BiTree T, SeqStack &S){
	//InitStack(S);
	struct BiTNode *p, *q;
	p=T;
	q=new BiTNode;
	while (p || !IsEmptyStack (S)){
		if(p){
			Push(S, *p);
			p=p->lchild;
		}else{
			Pop(S, *q);
			printf("%c", q->data);
			p=q->rchild;
		}
	}
}

//先序遍历二叉树的递归方法
void TraveTreeFirst(BiTree &T){
	if(T){
		printf("%c", T->data);
		TraveTreeFirst(T->lchild);
		TraveTreeFirst(T->rchild);
	}
} 

//先序遍历二叉树的非递归算法 
/*
从根结点开始先遍历左孩子,并输出。
当左孩子遍历完毕,取栈顶元素,找其右孩子,再继续遍历该结点的左孩子和右孩子,直到所有孩子遍历完毕。 
*/
void TraveTreeFirst2(BiTree T, SeqStack &S) {
	struct BiTNode *p, *q;
	p=T;q=T;
	while(p || !IsEmptyStack (S)){
		while(p){
			printf("%c", p->data);
			Push(S, *p);
			p=p->lchild;
		}
		if(!IsEmptyStack (S)){
			Pop(S, *q);
			p=q->rchild;
		}
	}
}

//后序遍历二叉树的递归算法
void TraveTreeLast(BiTree &T){
	if(T){
		TraveTreeLast(T->lchild);
		TraveTreeLast(T->rchild);
		printf("%c", T->data);
	}
} 

//后序遍历二叉树的非递归算法 
/**void TraveTreeLast2(BiTree T, SeqStack &S) {
	struct BiTNode *p, *q;
	p=T;q=T;
	Push(S, *p);
	//让右孩子先进栈,左孩子后进栈,这样出栈时就是左孩子先出栈,右孩子后出栈;
	//出栈的条件有两种:1.结点的左右孩子都为空;2.结点的左右孩子都被访问过。 
}**/

int main(){
	//stack<BiTNode> S;
	SeqStack S;
	bool initStack=InitStack(S);
	if(initStack==true){
		printf("栈初始化完成.\n");
	}else{
		printf("栈初始化失败.\n");
	}
	
	struct BiTNode *e;
	e=new BiTNode;
	e->data='A';
	printf("将A入栈.\n");
	Push(S, *e);
	
	bool isEmptyStack=IsEmptyStack(S);
	if(isEmptyStack==true){
		printf("栈为空.\n");
	}else{
		printf("栈非空.\n");
	}
	
	printf("取栈顶元素:");
	struct BiTNode *top;
	top=new BiTNode;
	GetTopElem(S, *top);
	printf("栈顶元素:%c\n", top->data);
	
	printf("出栈:");
	struct BiTNode *p;
	p=new BiTNode;
	Pop(S, *p);
	printf("%c\n", p->data);
	
	BiTree T;
	printf("输入二叉树的结点,先序遍历的顺序创建二链表:\n");
	//输入:ABC##DE#G##F###
	CreateBiTree(T);
	printf("中序遍历二叉树(递归):\n"); 
	InOrderTraveTree(T); 
	printf("\n");
	printf("中序遍历二叉树(非递归):\n"); 
	InOrderTraverse2(T, S);
	printf("\n");
	
	printf("先序遍历二叉树(递归):\n");
	TraveTreeFirst(T);
	printf("\n");
	printf("先序遍历二叉树(非递归):\n");
	TraveTreeFirst2(T, S);
	printf("\n");
	
	printf("后序遍历二叉树(递归):\n");
	TraveTreeLast(T);
	printf("\n");
	printf("后序遍历二叉树(非递归)\n");
	TraveTreeLast2(T, S);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值