#pragma once
enum flag
{
Child,Thread
};
template
struct ThrBiNode
{
Type data;
ThrBiNode *lchild, *rchild;
flag ltag, rtag;
};
template
class ThreadBiTree//线索二叉树
{
public:
ThreadBiTree();
~ThreadBiTree();
ThrBiNode *Next(ThrBiNode *p);
void InOrder();
private:
ThrBiNode *root;
ThrBiNode *Creat(ThrBiNode *bt);
void ThrBiTree(ThrBiNode *bt, ThrBiNode *pre);
};
template
ThreadBiTree::ThreadBiTree()
{
root = Creat(root);
ThrBiNode *pre;
pre= NULL;
ThrBiTree(root, pre);
}
template
ThreadBiTree::~ThreadBiTree()
{
}
template
inline ThrBiNode * ThreadBiTree::Next(ThrBiNode* p)
{
ThrBiNode *q;
if (p->rtag ==Thread)
q = p->rchild;
else
{
q = p->rchild;
while (q->ltag==Child)
{
q = q->lchild;
}
}
return q;
}
template
inline void ThreadBiTree::InOrder()
{
ThrBiNode *p;
p = root;
while (p->ltag==Child)
{
p = p->lchild;
}
cout << p->data << " ";
while (p->lchild!=NULL)
{
p = Next(p);
cout << p->data << " ";
}
}
template
inline ThrBiNode* ThreadBiTree::Creat(ThrBiNode* bt)
{
Type ch;
cin >> ch;
if (ch == '#')bt = NULL;
else
{
bt = new ThrBiNode;
bt->ltag = Child; bt->rtag = Child;
bt->data = ch;
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
}
return bt;
}
template
inline void ThreadBiTree::ThrBiTree(ThrBiNode* bt, ThrBiNode * pre)
{
if (bt == NULL)return;
ThrBiTree(bt->lchild, pre);
if (bt->lchild == NULL)
{
bt->ltag = Thread;
bt->lchild = pre;
}
if (bt->rchild == NULL)bt->rtag = Thread;
if (pre->rtag == Thread)pre->rchild = bt;
pre = bt;//pre中断跳出为空
ThrBiTree(bt->rchild, pre);
}
#include
#include "Tree.h"
using namespace std;
int main()
{
ThreadBiTree s;
s.InOrder();
return 0;
}
无法遍历,似乎是pre的问题,分布跟踪似乎线索的建立上有问题,大神求解~~
http://www.cnblogs.com/ljwTiey/p/4286865.html
http://blog.csdn.net/zdf0414/article/details/49977149