3008基于二叉链表的二叉树的遍历

描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别实现二叉树的先、中序和后序遍历。

输入

多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出

每组数据输出三行,为二叉树的先序、中序和后序序列。

输入样例 1 

abcd00e00f00ig00h00
abd00e00cf00g00
0

输出样例 1

abcdefigh
dcebfagih
decfbghia
abdecfg
dbeafcg
debfgca
//基于二叉链表的二叉树的遍历
#include <iostream>
using namespace std;
typedef struct LNode{
	char data; //存储这个结点的数据
	LNode *lchild; //结点的左子结点
	LNode *rchild; //结点的右子结点 
	LNode *parent; //结点的父结点
}LNode,*Tree;
void GetTree(Tree &tree,string::iterator &it){ //递归创建树 
	if(*it=='0'){ //如果读取到0 直接返回 iterator往后走 
		it++;
		return;
	}
	tree->data=*it; //(此时it必没有读到0) 赋值 
	it++; //it往后走 
	if(*it!='0'){tree->lchild=new LNode;tree->lchild->lchild=tree->lchild->rchild=tree->lchild->parent=NULL;} //如果it不是0就创建左子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题 
	GetTree(tree->lchild,it);//对左子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序 
	if(*it!='0'){tree->rchild=new LNode;tree->rchild->lchild=tree->rchild->rchild=tree->rchild->parent=NULL;} //如果it不是0就创建右子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
	GetTree(tree->rchild,it);//对右子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序 
}
void Pre_order_Traversal(Tree &tree,string &s){ //输入树和一个用于接收遍历的字符 
	s+=tree->data;
	if(tree->lchild) Pre_order_Traversal(tree->lchild,s); //操作左子树 并将目前加工好的子串给他 
	if(tree->rchild) Pre_order_Traversal(tree->rchild,s); //操作右子树 并将目前加工好的子串给他 
}
void Medium_order_Traversal(Tree &tree,string &s){ //输入树和一个用于接收遍历的字符 
	if(tree->lchild) Medium_order_Traversal(tree->lchild,s); //操作左子树 并将目前加工好的子串给他 
	s+=tree->data;
	if(tree->rchild) Medium_order_Traversal(tree->rchild,s); //操作右子树 并将目前加工好的子串给他 
}
void Post_order_Traversal(Tree &tree,string &s){ //输入树和一个用于接收遍历的字符 
	if(tree->lchild) Post_order_Traversal(tree->lchild,s); //操作左子树 并将目前加工好的子串给他 
	if(tree->rchild) Post_order_Traversal(tree->rchild,s); //操作右子树 并将目前加工好的子串给他 
	s+=tree->data;
}
void Calculate(string str){
	Tree tree=new LNode;
	tree->lchild=tree->rchild=tree->parent=NULL;
	std::string::iterator it=str.begin();
	GetTree(tree,it); //创造树
	string s; //用于接收字符 
	Pre_order_Traversal(tree,s);//前序遍历 
	cout<<s<<endl;
	s=""; //s清空 
	Medium_order_Traversal(tree,s); //中序遍历 
	cout<<s<<endl;
	s=""; //s清空 
	Post_order_Traversal(tree,s); //后序遍历 
	cout<<s<<endl;
}
int main(){
	string str; //一行数据 
	while(cin>>str&&str!="0") //输入一行数据到只有零为止 
		Calculate(str);
	return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘下来邦我吧

头发加了一根

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

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

打赏作者

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

抵扣说明:

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

余额充值