问题引入
代码实现
#include<iostream>
#include<malloc.h>
using namespace std;
//定义二叉树结点的结构
typedef struct Tnode{
char data; //数据域
struct Tnode *lchild,*rchild; //左孩子、右孩子
}Tnode,*BiTree;
//定义栈的结构
typedef struct{
BiTree *top; //栈顶
BiTree *base; //栈底
int size; //栈容量
}Stack;
//初始化栈
void initStack(Stack &S){
S.base=(BiTree *)malloc(50*sizeof(BiTree)); //分配存储空间
S.top=S.base;
S.size=50; //容量50
}
//判断栈是否为空
int EmptyStack(Stack S){
if(S.base==S.top){
return 1; //为空返回1
}else{
return 0; //非空返回0
}
}
//二叉树结点及左右孩子结点入栈
void Push(Stack &S,BiTree p){
if(S.top-S.base>=S.size){
cout<<"栈满了";
}
*(S.top)=p;
S.top++;
}
//栈中存储的结点出栈
void Pop(Stack &S,BiTree &p){
if(S.top==S.base){
cout<<"栈为空";
}
S.top--;
p=*(S.top);
}
//获取栈中位于栈顶的结点
int GetTop(Stack &S,BiTree &p){
if(S.top==S.base){
return 0; //如果栈为空,返回0
}else{
if(p==NULL){ //判断是否为空
return 0; //返回0
}
else{
p=*(S.top-1); //获取栈顶元素
return 1; //返回1
}
}
}
//创建二叉树结构体型函数-BiTree函数,递归创建二叉树
BiTree createBiTree(){
BiTree T; //定义二叉树结点结构体变量
char ch;
cin>>ch; //输入数据元素
if(ch == '#'){
T=NULL; //输入字符#,则将对应结点孩子指针域置为空
}else{
T=(Tnode *)malloc(sizeof(BiTree)); //分配结点存储空间
T->data=ch;
cout<<"请输入"<<T->data<<"的左孩子:";
T->lchild=createBiTree();
cout<<"请输入"<<T->data<<"的右孩子:";
T->rchild=createBiTree();
}
return T; //返回创建的二叉树T
}
//中序遍历并输出
void InOrderTraverse(BiTree T){
Stack S; //定义栈S
initStack(S); //初始化栈S
BiTree p=T; //定义辅助二叉树结点结构体变量p
Push(S,T); //根指针入栈
while(!EmptyStack(S)){
while(GetTop(S,p)&&p) Push(S,p->lchild); //向左走到尽头
Pop(S,p); //空指针退栈
if(!EmptyStack(S)){ //访问结点,向右一步
Pop(S,p);
cout<<p->data<<' '; //输出该结点值
Push(S,p->rchild); //该结点右孩子入栈
}
}
}
//主函数
int main(){
BiTree T; //定义二叉树结点结构体变量T
cout<<"请输入根结点:";
T=createBiTree();
cout<<endl; //换行
cout<<"中序遍历结果为:";
InOrderTraverse(T);
cout<<endl; //换行
}
运行结果