题目描写叙述
线索二叉树概念
1.定义
n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这样的附加的指针称为”线索”)。
这样的加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。依据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
注意:
线索链表攻克了二叉链表找左、右孩子困难的问题,出现了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。
2.线索链表的结点结构
线索链表中的结点结构为:
当中:
ltag和rtag是添加的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前趋或后继的线索。
以下你的任务:首先依据输入的序列建立二叉树,然后对二叉树进行线索化。最后中序遍历二叉线索树并输出结果。
输入要求
输入的第一行包括单独的一个数字T,表示測试序列的数目;
以下每一行为一个測试序列,測试序列是按先序序列输入字符 ,假设节点没有左或右孩子,则输入用空格表示,最后用一个空格结束一行的输入。
输出要求
相应每一个測试序列。採用中序遍历二叉线索树,输出一行
假如输入
2
ABC DE G F
-+a *b -c d /e f
应当输出
CBEGDFA
a+b*c-d-e/f
写了个线索二叉树
Code:
#include<bits/stdc++.h>
using namespace std;
typedef struct BTree
{
char data;
struct BTree *left,*right;
int ltag,rtag;
}BTree;
BTree *CreatBTree()
{
char ch=getchar();
if(ch==' ')
return NULL;
BTree *temp=(BTree *)malloc(sizeof(BTree));
temp->data=ch;
temp->ltag=temp->rtag=0;
temp->left=CreatBTree();
temp->right=CreatBTree();
return temp;
}
void inThread(BTree *p,BTree *&pre)
{
if(p)
{
inThread(p->left,pre);
if(!p->left)
{
p->left=pre;
p->ltag=1;
}
if(pre&&!pre->right)
{
pre->right=p;
pre->rtag=1;
}
pre=p;
inThread(p->right,pre);
}
}
void CreateInThread(BTree *T)
{
BTree *pre=NULL;
if(T)
{
inThread(T,pre);
pre->right=NULL;
pre->rtag=1;
}
}
BTree *first(BTree *p)
{
while(p->ltag==0)
p=p->left;
return p;
}
BTree *next(BTree *p)
{
if(p->rtag==0)
return first(p->right);
else
return p->right;
}
void inOrder(BTree *T)
{
for(BTree *p=first(T);p!=NULL;p=next(p))
cout<<p->data;
}
void delBTree(BTree *T)
{
BTree *pre=first(T);
BTree *p=next(pre);
for(;p!=NULL;pre=p,p=next(p))
free(pre);
free(pre);
}
int main()
{
int t;
cin>>t;
while(t--)
{
getchar();//吃掉回车
BTree *root=CreatBTree();
getchar();//吃掉最后结尾的空格
CreateInThread(root);
inOrder(root);
cout<<endl;
delBTree(root);
}
return 0;
}