源码:
/**
*中序线索二叉树
*@author 菜鸟
*@version 2014.7.23
*/
#include <iostream>
#include <windows.h>
#include <malloc.h>
typedef char DataType;
using namespace std;
//定义线索二叉树的结构体
typedef struct Node{
DataType data;
struct Node *leftChild;
struct Node *rightChild;
int leftThread;
int rightThread;
}ThreadBiTreeNode;
//定义遍历结构体
typedef struct{
ThreadBiTreeNode *root;
ThreadBiTreeNode *current;//表示当前遍历的节点的指针
int completeTag;//遍历结束的标记
}ThreadBiTreeSearch;
/**
*中序线索化二叉树的操作
*@param ThreadBiTreeNode *current表示当前节点的指针
*@param ThreadBiTreeNode **pre表示当前节点的前驱结点指针
*@return 无
*/
void InThreadOperation(ThreadBiTreeNode *current,ThreadBiTreeNode **pre){
if(current != NULL){
InThreadOperation(current->leftChild,pre);
if(current->leftChild == NULL){
current->leftThread = 1;
current->leftChild = *pre;
}else{
current->leftThread = 0;
}
if(current->rightChild != NULL){
current->rightThread = 0;
}else{
current->rightThread = 1;
}
if((*pre)->rightChild == NULL){
(*pre)->rightThread = 1;
(*pre)->rightChild = current;
}else{
current->rightThread = 0;
}
*pre = current;
InThreadOperation(current->rightChild,pre);
}
cout<<"线索化成功!"<<endl;
}
/**
*创建中序线索化二叉树
*@param ThreadBiTreeNode **root表示根节点
*@return 无
*/
void CreateInThreadOperation(ThreadBiTreeNode **root){
ThreadBiTreeNode *p = *root;
ThreadBiTreeNode *current = NULL;
ThreadBiTreeNode *pre = *root;
*root = (ThreadBiTreeNode *)malloc(sizeof(ThreadBiTreeNode));
if(p == NULL){//表明此时二叉树为空树
(*root)->leftThread = 0;//没有前继
(*root)->rightThread = 1;//有后驱
(*root)->leftChild = *root;
(*root)->rightChild = *root;
cout<<"创建成功!"<<endl;
}else{
current = p;
(*root)->leftChild = p;
(*root)->leftThread = 0;
InThreadOperation(current,&pre);
pre->rightChild = *root;
pre->rightThread = 1;
(*root)->rightChild = pre;
(*root)->rightThread = 1;
cout<<"创建成功!"<<endl;
}
}
/**
*创建线索二叉树节点
*@param DataType data表示要插入的节点数据
*@param ThreadBiTreeNode *leftChild 表示左孩子节点
*@param ThreadBiTreeNode *rightChild 表示右孩子节点
*@return 无
*/
ThreadBiTreeNode* NewCreateNode(DataType data,ThreadBiTreeNode *leftChild,ThreadBiTreeNode *rightChild){
ThreadBiTreeNode *p = NULL;
if(p != NULL){
free(p);
}
p = (ThreadBiTreeNode*)malloc(sizeof(ThreadBiTreeNode));
if(p != NULL){
cout<<"空间申请成功!"<<endl;
p->data = data;
p->leftChild = leftChild;
p->rightChild = rightChild;
return p;
}else{
cout<<"空间申请失败!"<<endl;
return NULL;
}
}
/**
*创建线索二叉树
*@param ThreadBiTreeNode *8root 表示头节点
*@return 无
*/
void MakeNewBiTree(ThreadBiTreeNode **root){
ThreadBiTreeNode *b= NULL,*c= NULL,*d=NULL,*e=NULL,*f= NULL,*g=NULL;
g = NewCreateNode('G',NULL,NULL);
d = NewCreateNode('D',NULL,g);
b = NewCreateNode('B',d,NULL);
e = NewCreateNode('E',NULL,NULL);
f = NewCreateNode('F',NULL,NULL);
c = NewCreateNode('C',e,f);
*root = NewCreateNode('A',b,c);
/* char c =0;
char c1 = 0;
ThreadBiTreeNode *p = NULL;
ThreadBiTreeNode *p1[100] ={ NULL};
int data[100] = {0};
int j = 0;
while(c1 !='#'){
cout<<"是否进行输入:Y/N"<<endl;
cin>>c1;
if(c1 == 'Y'||c1 == 'y'){
cout<<"请输入元素:"<<endl;
cout<<"元素>>";cin>>c;
data[j] = c;
j++;
cout<<"输入成功!"<<endl;
}else if(c1 == 'N'||c1 == 'n'){
break;
}else{
continue;
}
}
for(int i = 0;i <j;i++){
p1[i] = NewCreateNode(data[i],p1[i+1],p1[i+2]);
}
*root = p1[0];*/
}
/**
*初始化中序线索二叉树
*@param ThreadBiTreeNode *root 表示根节点地址
*@param ThreadBiTreeSearch *tree表示遍历结构地址
*@return 无
*/
void ThreadInitiateOperation(ThreadBiTreeSearch *tree,ThreadBiTreeNode *root){
tree->root = root;
tree->current = root;
if(root == NULL){
tree->completeTag = 1;
}else{
tree->completeTag = 0;
}
}
/**
*遍历操作指向要遍历的第一个元素
*@param ThreadBiTreeSearch *tree 表示遍历结构地址
*@return 无
*/
void SearchGetFirstOperation(ThreadBiTreeSearch *tree){
tree->current = tree->root;
while(tree->current->leftThread == 0){
tree->current = tree->current->leftChild;
}
if(tree->current == tree->root){
tree->completeTag =1;
}else{
tree->completeTag = 0 ;
}
}
/**
*遍历操作指向要遍历的下一个元素
*@param ThreadBiTreeSearch *tree 表示遍历结构地址
*@return 无
*/
void SearchGetNextOperation(ThreadBiTreeSearch *tree){
ThreadBiTreeNode *p = tree->current->rightChild;
if(tree->completeTag == 1){
return ;
}
if(tree->current->rightThread == 0){
while(p->leftThread == 0){
p = p->leftChild;
}
}
tree->current = p;
if(tree->current == tree->root){
tree->completeTag = 1;
}
}
/**
*结束遍历
*@param ThreadBiTreeSearch *tree 表示遍历结构地址
*@return int
*/
int SearchEnd(ThreadBiTreeSearch *tree){
return tree->completeTag;
}
int main(){
ThreadBiTreeNode *root = NULL;
ThreadBiTreeSearch *tree = NULL;
tree = (ThreadBiTreeSearch*)malloc(sizeof(ThreadBiTreeSearch));
MakeNewBiTree(&root);
CreateInThreadOperation(&root);
cout<<"二叉树中序遍历序列为:"<<endl;
ThreadInitiateOperation(tree,root);
for(SearchGetFirstOperation(tree);!SearchEnd(tree);SearchGetNextOperation(tree)){
cout<<"元素:"<<tree->current->data<<endl;
}
system("PAUSE");
return 1;
}