你的那个线索化二叉树中的pre参数应该是全局的,想想是吗?
下面是用c++写的代码,希望对你有用:
树结点文件:
#ifndef THREADTREENODE_H
#define THREADTREENODE_H
template
class ThreadTreeNode
{
public:
T data;
int lTag;
int rTag;
ThreadTreeNode
ThreadTreeNode
ThreadTreeNode()
{
lTag=0;
rTag=0;
L_child=NULL;
R_child=NULL;
}
};
#endif
穿线二叉树的文件:
#ifndef THREADTREE_H
#define THREADTREE_H
#include
#include
#include
#include"ThreadTreeNode.h"
#include"node_infor.h"
using namespace std;
template
class ThreadTree
{
public:
ThreadTree();
~ThreadTree();
void InThread();
void InThread(ThreadTreeNode
void In_order();
void InThread_test();
ThreadTreeNode
ThreadTreeNode
void Find_Test();
void Insert_Node(ThreadTreeNode
void Insert_Test();
ThreadTreeNode
void Pre_order();
// void Post_order();
ThreadTreeNode
private:
void creat_tree();
void dele_tree(ThreadTreeNode
void visit(ThreadTreeNode
ThreadTreeNode
node_infor
int count;
};
template
ThreadTree
{
cout<<"前序构造二叉树!"<
ifstream in("store_infor.txt");
while(!in.eof())
{
in>>store_infor[count].data;
in>>store_infor[count].ltag;
in>>store_infor[count].rtag;
count++;
}
in.close();
creat_tree();
}
template
void ThreadTree
{
ThreadTreeNode
ThreadTreeNode
stack
root=new ThreadTreeNode
pointer=root;
for(int i=0;i
pointer->data=store_infor[i].data;
if(store_infor[i].rtag==1)
{
creat_help.push(pointer);
}
temp_pointer=new ThreadTreeNode
if(store_infor[i].ltag==1)
{
pointer->L_child=temp_pointer;
}
else
{
pointer=creat_help.top();
creat_help.pop();
pointer->R_child=temp_pointer;
}
pointer=temp_pointer;
}
pointer->data=store_infor[count-1].data;
}
template
void ThreadTree
{
cout<
}
template
void ThreadTree
{
if(root!=NULL)
{
InThread(root->L_child,pre);
}
else
{
return;
}
if(root->L_child==NULL && pre)
{
root->lTag=1;
root->L_child=pre;
}
if(pre && pre->R_child==NULL)
{
pre->rTag=1;
pre->R_child=root;
}
pre=root;
InThread(root->R_child,pre);
}
template
void ThreadTree
{
ThreadTreeNode
ThreadTreeNode
stack
while(true)
{
while(pointer)
{
InThread_help.push(pointer);
pointer=pointer->L_child;
}
if(InThread_help.empty())
return;
pointer=InThread_help.top();
InThread_help.pop();
if(pointer->L_child==NULL && pre_pointer)
{
pointer->lTag=1;
pointer->L_child=pre_pointer;
}
if(pre_pointer && pre_pointer->R_child==NULL)
{
pre_pointer->rTag=1;
pre_pointer->R_child=pointer;
}
pre_pointer=pointer;
pointer=pointer->R_child;
}
}
template
void ThreadTree
{
ThreadTreeNode
InThread(root,pre);
//InThread();
}
template
ThreadTreeNode
{
if(pointer->lTag==0 && pointer->L_child!=NULL)
{
return pointer->L_child;
}
while(pointer->rTag==1)
{
pointer=pointer->R_child;
}
return pointer->R_child;
}
template
ThreadTreeNode
{
ThreadTreeNode
while(pointer->L_child)
{
pointer=pointer->L_child;
}
while(true)
{
if(pointer->data==ele)
{
return pointer;
}
else if(pointer->R_child==NULL)
{
return NULL;
}
else if(pointer->rTag==1)
{
pointer=pointer->R_child;
}
else
{
pointer=pointer->R_child;
while(pointer->lTag==0)
{
pointer=pointer->L_child;
}
}
}
}
template
ThreadTreeNode
{
if(pointer->rTag==0 && pointer->R_child!=NULL)
{
return pointer->R_child;
}
else if(pointer->lTag==0)
{
return pointer->L_child;
}
else
{
pointer=pointer->L_child;
while(pointer->lTag==1)
{
pointer=pointer->L_child;
}
return pointer;
}
}
template
ThreadTreeNode
{
if(pointer->lTag==1)
{
return pointer->L_child;
}
if(pointer->L_child==NULL)
{
return NULL;
}
pointer=pointer->L_child;
while(pointer->rTag==0)
{
pointer=pointer->R_child;
}
return pointer;
}
template
void ThreadTree
{
cout<<"查找前序的后继!"<
cin>>ele;
if(ThreadTreeNode
{
visit(pointer);
cout<
else
{
cout<<"无此相关项!"<
cout<<"查找后序下的前继"<
if(ThreadTreeNode
{
visit(pointer);
cout<
else
{
cout<<"无此相关项!"<
cout<<"查找中序下的前继!"<
if(ThreadTreeNode
{
visit(pointer);
cout<
else
{
cout<<"无此相关项!"<
}
template
void ThreadTree
{
if(root==NULL)
{
return;
}
cout<<"前序周游:"<
while(true)
{
while(pointer->lTag==0)
{
visit(pointer);
if(pointer->L_child==NULL)
{
break;
}
pointer=pointer->L_child;
}
if(pointer->lTag==1)
visit(pointer);
if(pointer->R_child==NULL)
{
cout<
}
while(pointer->rTag==1)
{
pointer=pointer->R_child;
}
pointer=pointer->R_child;
}
}
//template
/*void ThreadTree
{
if(root==NULL)
return;
cout<<"后序周游:"<
while(true)
{
while(pointer->lTag==0)
{
if(pointer->L_child==NULL)
break;
pointer=pointer->L_child;
}
if(pointer->rTag==1 || pointer->R_child==NULL)
{
visit(pointer);
if(pointer->rTag==1)
pointer=pointer->R_child;
}
pointer
}
}*/
template
void ThreadTree
{
if(root==NULL)
return;
cout<<"中序周游:"<
while(pointer->L_child!=NULL)
{
pointer=pointer->L_child;
}
while(true)
{
visit(pointer);
if(pointer->R_child==NULL)
{
cout<
}
if(pointer->rTag==1)
{
pointer=pointer->R_child;
}
else
{
pointer=pointer->R_child;
while(pointer->lTag==0)
{
pointer=pointer->L_child;
}
}
}
}
template
void ThreadTree
{
ThreadTreeNode
if(pointer->R_child==NULL)
{
temp_pointer=NULL;
}
else if(pointer->rTag==1)
{
temp_pointer=pointer->R_child;
}
else
{
temp_pointer=pointer->R_child;
while(temp_pointer->lTag==0)
{
temp_pointer=temp_pointer->L_child;
}
}
/*pointer->R_child=newpointer;
newpointer->R_child=pointer->R_child;
newpointer->lTag=1;
newpointer->L_child=pointer;
newpointer->rTag=pointer->rTag;
pointer->rTag=0;*/
if(temp_pointer!=NULL && temp_pointer->lTag==1)
{
temp_pointer->L_child=newpointer;
}
newpointer->lTag=1;
newpointer->L_child=pointer;
newpointer->R_child=pointer->R_child;
newpointer->rTag=pointer->rTag;
pointer->R_child=newpointer;
pointer->rTag=0;
}
template
void ThreadTree
{
cout<<"结点插入,位置是指定结点在中序下的后继!"<
cin>>ele;
cout<<"请输入新结点的元素:"<
cin>>new_ele;
ThreadTreeNode
newpointer->data=new_ele;
Insert_Node(Find_Node(ele),newpointer);
}
template
void ThreadTree
{
if(root!=NULL && root->lTag==0 && root->rTag==0)
{
dele_tree(root->L_child);
dele_tree(root->R_child);
delete root;
}
}
template
ThreadTree
{
dele_tree(root);
}
#endif