zoukankan      html  css  js  c++  java
  • bithrtree

    #include "stdio.h"
    #include "stdlib.h"
    
    #define OK 1
    #define ERROR 0
    
    typedef char TElemType;
    typedef char Elemtype;
    typedef int Status;
    typedef enum PointerTag {Link,Thread}; //link==0:pointer,Thread==1:thread
    typedef struct BiThrNode
    {
    	TElemType data;
    	struct BiThrNode *lchild,*rchild;
    	PointerTag LTag,RTag;
    }BiThrNode,*BiThrTree;
    
    BiThrTree pre; // 全局变量,始终指向刚刚访问过的结点
    
    void InThreading(BiThrTree p)
    {
    	if(p)
    	  {
    	   InThreading(p->lchild);//左子树线索化
    	   if(!p->lchild){p->LTag=Thread;p->lchild=pre;}//前驱线索
    	   if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}//后续线索
    	   pre=p; //保持pre指向p的前驱
    	   InThreading(p->rchild);//右子树线索化
    	  }//if
    }//InThreading
    
    
    Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)
    {
    //中序遍历二叉树,并将其中序线索化,Thrt指向头结点
    //BiThrTree Thrt;
    	if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(-1);
    	Thrt->LTag=Link; //建立头结点
    	Thrt->RTag=Thread; //右指针回指
    	Thrt->rchild=Thrt; 
    	if(!T) Thrt->rchild=Thrt; //若二叉树为空,则左指针回指
    	else {
    	     Thrt->lchild=T;
    	     pre=Thrt;
    	     InThreading(T);  //中序遍历进行中序线索化
    	     pre->rchild=Thrt;//最后一个结点线索化
    	     pre->RTag=Thread;
    	     Thrt->rchild=pre;
    	    }
    return OK;
    }//InOrderThreading
    
    Status InOrderTraverse_Thr(BiThrTree T)
    {
    //T指向头结点,头结点的左链lchild指向根结点,非递归算法
    	BiThrTree p; 
    	p=T->lchild;
    	while(p!=T) //空树或遍历结束时,T==p
    	 {
    		while(p->LTag==Link) p=p->lchild;
    		printf("%c",p->data); //访问其左子树为空的结点
    		while(p->RTag==Thread&&p->rchild!=T)
              {
    	          p=p->rchild;
                  printf("%c",p->data); //访问后续结点
              }//while
    	   p=p->rchild;
    	}//while
    	printf("
    ");
    	return OK;
    }//InOrderT_Thr
    
    BiThrTree InOrderSearch_Thr(BiThrTree T,Elemtype ch)
    {
    //T指向头结点,头结点的左链lchild指向根结点,非递归算法,查找指定字符ch,找到返回,未找到返回NULL
    	BiThrTree p; 
    	p=T->lchild;
    	while(p!=T) //空树或遍历结束时,T==p
    	 {
    		while(p->LTag==Link) p=p->lchild;
    		if(p->data==ch) return p; //找到,返回该结点指针
    		while(p->RTag==Thread&&p->rchild!=T)
              {
    	          p=p->rchild;
                  if(p->data==ch) return p; //找到,返回该结点指针
              }//while
    	   p=p->rchild;
    	}//while
        return NULL;
    }//InOrderT_Thr
    
    Status CreateBitree(BiThrTree &T)
    {//按先序次序输入二叉树
    	char ch;
    	scanf("%c",&ch);
    	if(ch==' ') T=NULL;
    	else{
    			if(!(T=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(1);
    			T->data=ch;T->LTag=Link;T->RTag=Link;
    			CreateBitree(T->lchild);
    			CreateBitree(T->rchild);
    		}//else
    	return OK;
    }//CreateBitree
    
    
    Status printelemt(Elemtype e)
    {
    	printf("%c",e);
    	return OK;
    }
    
    Status preordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
    {
    	if(t)
    	{
    		if(visit(t->data))
    			if(preordertraverse(t->lchild,visit))
    					if(preordertraverse(t->rchild,visit))  return OK;
    		return ERROR;
    	}
    	else 
    		return OK;
    }
    
    Status inordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
    {
    	if(t)
    	{
    	    if(inordertraverse(t->lchild,visit))
    		    if(visit(t->data))
    				if(inordertraverse(t->rchild,visit))  return OK;
    		return ERROR;
    	}
    	else 
    		return OK;
    }
    
    Status postordertraverse(BiThrTree t,Status (*visit)(Elemtype e))
    {
    	if(t)
    	{
    	    if(postordertraverse(t->lchild,visit))
    			if(postordertraverse(t->rchild,visit))  	
    					if(visit(t->data)) return OK;
    		return ERROR;
    	}
    	else 
    		return OK;
    }
    
    
    BiThrTree InNext(BiThrTree p) 
    /*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
    { 
    	BiThrTree Next;
    	BiThrTree q;
    	if (p->RTag==1)  
    		 Next = p->rchild; 
    	else
    	{ 
    		if(p->rchild!=NULL)
    		{
    			for(q=p->rchild; q->LTag==0 ;q=q->lchild);
    			Next=q; 
    		}
    		else
    			Next = NULL;
    	} 
    	return(Next);
    }
    
    BiThrTree InPre(BiThrTree p)
    /* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果 */
    {  
    	BiThrTree q;
    	if(p->LTag==1)
    		pre = p->lchild; 
    	else 
    	{ 
    		for(q = p->lchild;q->RTag==0;q=q->rchild);
    		pre=q;
    	}
     return(pre);
    }
    
    int main()
    {
    	char ch;
    	BiThrTree T,Thrt,p,q;
    	CreateBitree(T);//创建
    	preordertraverse(T,printelemt);
    	printf("
    ");
    	inordertraverse(T,printelemt);
    	printf("
    ");
    	postordertraverse(T,printelemt);
    	printf("
    ");
    	InOrderThreading(Thrt,T);//线索化
    	printf("中序遍历该线索二叉树得到的序列为:
    "); 
    	InOrderTraverse_Thr(Thrt);//遍历访问
        getchar();
        printf("请输入树中的一个字符");
        scanf("%c",&ch);
    
    	p=InOrderSearch_Thr(T,ch);
    	q=InNext(p);
    	printf("后继结点:%c
    ",q->data);
    	q=InPre(p);
    	printf("先趋结点:%c
    ",q->data);
    	return OK;
    }
    
    
    
  • 相关阅读:
    PAT 1088. Rational Arithmetic
    PAT 1087. All Roads Lead to Rome
    PAT 1086. Tree Traversals Again
    PAT 1085. Perfect Sequence
    PAT 1084. Broken Keyboard
    PAT 1083. List Grades
    PAT 1082. Read Number in Chinese
    求最大公因数
    [转载]Latex文件转成pdf后的字体嵌入问题的解决
    [转载]Matlab有用的小工具小技巧
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3464997.html
Copyright © 2011-2022 走看看