数据结构实验-二叉树-构造和遍历
(实验)线索二叉树构造和遍历
任选一种(先序、中序、后序)线索二叉树,实现如下功能:
①创建二叉树:按照先序序列依次输入各个结点以及空子树,创建二叉树;
②线索化二叉树:对创建的二叉树进行先序遍历;
③遍历线索二叉树:对线索二叉树进行相应的遍历。
#include<iostream>
using namespace std;
//线索二叉树的存储结构
typedef struct BiThrNode
{
char data;
struct BiThrNode* lchild;
struct BiThrNode* rchild;
int LTag, RTag;
}BiThrNode, *BiThrTree;
//全局变量pre
BiThrNode* pre = new BiThrNode;
// 建立二叉链表
void CreateBiTree(BiThrTree& T)
{
//按先序的次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
char ch;
cin >> ch;
if (ch == '#')
T = NULL; // 递归结束,建空树
else
{
T = new BiThrNode;
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 递归创建左子树
CreateBiTree(T->rchild); // 递归创建右子树
}
}
void InThreading(BiThrTree p) {
if (p)
{
InThreading(p->lchild);
//处理p节点的左指针
if (p->lchild==NULL)
{
p->LTag = 1;
p->lchild = pre;
}
else
{
p->LTag = 0;
}
//处理p节点的右指针
if (pre->rchild==NULL)
{
pre->RTag = 1;
pre->rchild = p;
}
else
{
pre->RTag = 0;
}
pre = p;
InThreading(p->rchild);
}
}
//二叉树的线索化
void InOrderThreading(BiThrTree &Thrt, BiThrTree T)
{
//初始化头结点
Thrt = new BiThrNode;
Thrt->LTag = 0;
Thrt->RTag = 1;
Thrt->rchild = Thrt;
if (!T) {
Thrt->lchild = Thrt;
}
else
{
Thrt->lchild = T;
pre = Thrt;
InThreading(T);
//收尾工作
pre->RTag = 1;
pre->rchild = Thrt;
Thrt->rchild = pre;
}
}
void InOrderTraverse_Thr(BiThrTree T) {
BiThrTree p = T->lchild;
while (p!=T)
{
while (p->LTag==0)
{
p = p->lchild;
}
cout << p->data;
while (p->RTag == 1 && p->rchild != T)
{
p = p->rchild;
cout << p->data;
}
p = p->rchild;
}
}
int main()
{
BiThrTree Thrt;
BiThrTree T;
CreateBiTree(T);
InOrderThreading(Thrt, T);
InOrderTraverse_Thr(Thrt);
return 0;
}
//输入例子:ABDH#K###E##CFI###G#J##