我准备说一下,线索二叉树,同样的,你必须首先明白,什么是线索二叉树,而为什么有线索二叉树呢?
这都是基本问题,我就不多讲了,因为连这些都不懂,估计你也就看不懂线索二叉树,到底在干什么了,多说无益先直接上代码。
clue_in_BTree.h
#include<iostream>
using namespace std;
template <class T>
struct TTnode{
T d;
int lflag;
int rflag;
TTnode *lchild;
TTnode *rchild;
};
template <class T>
class in_threaded_BT{
private:
TTnode<T> *BT;
public:
in_threaded_BT(){BT=NULL;return;}
void create_Binary_Tree(T);
void create_threaded_BT();
void intrav_threaded_BT();
};
template <class T>
void in_threaded_BT<T>::create_Binary_Tree(T end){
TTnode<T> *p;
T x;
cin>>x;
if(x==end) return;
p=new TTnode<T>;
p->d=x;p->lchild=NULL;p->rchild=NULL;
p->lflag=0;p->rflag=0;
BT=p;
create(p,1,end);
create(p,2,end);
return;
}
template <class T>
static create(TTnode<T> *p,int k,T end){
TTnode<T> *q;
T x;
cin>>x;
if(x!=end){
q=new TTnode<T>;
q->d=x;q->lchild=NULL;q->rchild=NULL;
q->lflag=0;q->rflag=0;
if(k==1) p->lchild=q;
if(k==2) p->rchild=q;
create(q,1,end);
create(q,2,end);
}
return 0;
}
template <class T>
void in_threaded_BT<T>::create_threaded_BT(){
TTnode<T> *p,*q=NULL;
p=BT;
in_threaded(p,&q);
return;
}
template <class T>
static in_threaded(TTnode<T>*p,TTnode<T>**h){
if(p!=NULL){
in_threaded(p->lchild,h);
if((*h!=NULL)&&((*h)->rchild==NULL)){
(*h)->rchild=p;(*h)->rflag=1;
}
if(p->lchild==NULL){
p->lchild=(*h);p->lflag=1;
}
*h=p;
in_threaded(p->rchild,h);
}
return 0;
}
template <class T>
void in_threaded_BT<T>::intrav_threaded_BT(){
TTnode<T> *p;
if(BT==NULL) return;
p=BT;
while(p->lflag==0)p=p->lchild;
cout<<p->d<<" ";
while(p->rchild!=NULL){
if(p->rflag==1) p=p->rchild;
else
{
p=p->rchild;
while((p->lflag==0)&&(p->lchild!=NULL)) p=p->lchild;
}
cout<<p->d<<" ";
}
cout<<endl;
return;
}
如何使用呢?请看,clue_in_BTree_main.cpp
#include"clue_in_BTree.h"
int main(){
in_threaded_BT<int> b;
cout<<"input the element(-1 means end):"<<endl;
b.create_Binary_Tree(-1);
b.create_threaded_BT();
cout<<"中序排序:"<<endl;
b.intrav_threaded_BT();
return 0;
}
本来遍历有三种,其他那两种我就不写了,这个线索二叉树,我想说,没接触过的,肯定觉得复杂死了,我调代码也花了很久,确实真的够乱,你还要理解指针的指针,能看懂这些代码真的不容易,我就简单分析几句。
如何生成中序线索二叉链表?、
1.找第一个结点,在哪里?从根节点出发,从左链一直找,直到第一个叶子节点,这个节点就是中序的第一个开始结点。
2.看清楚了,节点p表示当前,h表示前一个节点,
那么:假如上次访问的节点的右指针为空,那么把当前的节点号填入,并把rflag=1
假如当前的左指针为空,那么把上次的节点填入,并lflag=1,并沿右子树的左链扫描
最后,如何快速遍历二叉树?
找它们的标志,很简单
1.沿左链找到叶子节点
2.右子树的左链扫描
3.最后就是右子树的右边扫描后件
再说一次,这个真的是很乱很乱,初次看真的很复杂,你必须很清楚的理解,中序遍历和指针的指针,否则,根本看不懂。截个图看一下结果: