题目描述
线索二叉树概念
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 02:56:23