线索二叉树:中序线索二叉树的遍历
作者: 冯向阳时间限制: 1S章节: DS:树
截止日期: 2022-06-30 23:55:00
问题描述 :
目的:使用C++模板设计中序线索二叉树的抽象数据类型(ADT)。并在此基础上,使用中序线索二叉树ADT的基本操作,设计并实现简单应用的算法设计。
内容:(1)请参照二叉树的ADT模板,设计中序线索二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)
(2)ADT的简单应用:使用该ADT设计并实现若干遍历线索二叉树的算法设计。
应用:要求设计一个算法,对建立的中序线索二叉树进行遍历。
提示:中序遍历线索二叉树,首先找到第一个访问的结点,即最左下结点,然后通过查找后继结点的方法进行遍历。
参考函数原型:
中序线索二叉树的遍历(共有成员函数)
//中序线索二叉树的遍历
template<class ElemType>
void Thread_BinaryTree<ElemType>::InThreading_Traverse(Thread_BinaryTreeNode<ElemType> *root, bool (*visit)(Thread_BinaryTreeNode<ElemType> *root));
输入说明 :
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
输出说明 :
第一行:中序线索二叉树的遍历结果
输入范例 :
#
A B # C D # # E # # F # G # H # #
输出范例 :
B(1,0),D(1,1),C(0,0),E(1,1),A(0,0),F(1,0),G(1,0),H(1,1)
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int flag=1;
typedef struct BTNode
{
string data;
BTNode* lchild;
BTNode* rchild;
int ltag=0;
int rtag=0;
}BTNode,*BIT;
void creat_tree(BIT *T,string sym)
{
string ch;
cin>>ch;
if(ch==sym)
{
*T=NULL;
}
else
{
*T=new BTNode;
(*T)->data=ch;
creat_tree(&(*T)->lchild,sym);
creat_tree(&(*T)->rchild,sym);
}
}
BIT prenode=new BTNode;
void Inorder(BIT T)
{
if(T)
{
Inorder(T->lchild);
if(T->lchild==NULL)
{ T->ltag=1;
T->lchild=prenode;
}
if(prenode!=NULL&&prenode->rchild==NULL)
{
prenode->rtag=1;
prenode->rchild=T;
}
prenode=T;
if(T->rtag==0&&T->rchild==NULL)
{
T->rtag=1;
}
Inorder(T->rchild);
}
}
BIT fxia(BIT *T)
{
BIT next=NULL;
BIT curnode;
if((*T)->rtag==1)
{
next=(*T)->rchild;
}
else if((*T)->rtag==0)
{
if((*T)->rchild==NULL)
{
next=NULL;
}
else if((*T)->rchild!=NULL)
{
curnode=(*T)->rchild;
while(curnode->ltag==0)
{
curnode=curnode->lchild;
}
next=curnode;
}
}
return next;
}
BIT ftou(BIT T)
{
BIT curnode=T;
if(curnode)
{
while(curnode->lchild!=NULL)
{
curnode=curnode->lchild;
}
}
return curnode;
}
void shuchu(BIT *T)
{
BIT Q;
Q=ftou(*T);
while(Q!=NULL)
{
if(flag==0)
{
cout<<",";
}
flag=0;
cout<<Q->data<<"(";
cout<<Q->ltag<<",";
cout<<Q->rtag<<")";
Q=fxia(&Q);
}
}
int main()
{
prenode=NULL;
BIT T;
string sym;
cin>>sym;
creat_tree(&T,sym);
Inorder(T);
shuchu(&T);
return 0;
}