标签:中序线索二叉树
//所谓线索二叉树无非是为了让原本指向NULL的节点指向一个具体的
//已经存在的节点,逻辑上实现指针的无空指向的实现,下面是我中
//序线索二叉树的实现。还是把先序线索二叉树与后序线索分开来写吧。
#include<iostream>
using namespace std;
template<typename Type>
struct Node
{
Type data;
bool rflags;//false为线。
bool lflags;
Node<Type> *right;
Node<Type> *left;
Node(Type d = Type()) :data(d), right(NULL), left(NULL), lflags(false),rflags(false){}
};
template<typename Type>
class MyTree
{
public:
MyTree() :root(NULL){}
void Create_lvr_lrv(Type *LVR,Type *LRV)
{
int n = strlen(LRV);
Create_lvr_lrv(root,LVR,LRV,n);
}
void Create_Thread_V()//中序构造线索二叉树。
{
Node<Type> *pr = NULL;
Create_Thread_V(root, pr);
Node<Type> *p = root;
while (p->right != NULL)
{
p = p->right;
}
p->right = NULL;
p->rflags = true;
}
void Printf_V()
{
Node<Type> *p = root;
while (p->left != NULL)
{
p = p->left;
}
Printf_V(p);
}
private:
void Printf_V(Node<Type> *t)//中序线索二叉树的打印。
{
Node<Type> *p = t;
while (p != NULL)
{
cout << p->data << " ";
Node<Type>*m = p->right;
if (p->rflags != true)
{
while (m != NULL && m->lflags != true)
{
m = m->left;
}
}
p=m;
}
}
void Create_Thread_V(Node<Type> *t, Node<Type> *&pr)
{
if (t == NULL)
{
return;
}
Create_Thread_V(t->left, pr);
if (t->left== NULL)
{
t->left = pr;
t->lflags = true;
}
if (pr!=NULL && pr->right ==NULL)
{
pr->right = t;
pr->rflags = true;
}
pr = t;
Create_Thread_V(t->right,pr);
}
void Create_lvr_lrv(Node<Type> *&t, Type *LVR, Type *LRV, int n)
{
if (n == 0)return;
int i = 0;
while (LRV[n - 1] != LVR[i])i++;
t = new Node<Type>(LRV[n - 1]);
Create_lvr_lrv(t->right,LVR+i+1,LRV+i,n-i-1);
//根据中序及后序构造二叉树,此处我选择先构造右子树,然后才构造左子树。
Create_lvr_lrv(t->left,LVR,LRV,i);
}
private:
Node<Type> *root;
};
int main()
{
char LVR[] = "CBDAFEG";
char LRV[] = "CDBFGEA";
MyTree<char> mt;
mt.Create_lvr_lrv(LVR,LRV);
mt.Create_Thread_V();
mt.Printf_V();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:中序线索二叉树
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/47341511