线索二叉树

源码:

 

/**
*中序线索二叉树
*@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;
}

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值