#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);
}
二叉树的二叉链表示
最新推荐文章于 2022-03-22 17:30:03 发布