(超详细)C++实现二叉树的遍历、创建、输出(数据结构)

51 篇文章 13 订阅
47 篇文章 2 订阅

问题引入

代码实现

#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; //换行 
}

运行结果

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值