Ejemplo n.º 1
0
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;
        InThreading(p->rchild);
    }
}
Ejemplo n.º 2
0
void InOrderThreading(ptree *Thrt,ptree pHead)
{
	ptree pPre;
	if(!((*Thrt)=(ptree)malloc(sizeof(TreeNode))))//initial	
	{
		exit(-1);	
	}
	(*Thrt)->Lflag=Link;		
	(*Thrt)->Rflag=Thread;
	(*Thrt)->rightchild=(*Thrt);
	if(!pHead)//if pHead is NULL
	{
		(*Thrt)->leftchild=(*Thrt);//point back 
	}
	else
	{
		(*Thrt)->leftchild=pHead;
		pPre=(*Thrt);			
		InThreading(pHead,&pPre);	
		pPre->rightchild=(*Thrt);
		pPre->Rflag=Thread;	
		(*Thrt)->rightchild=pPre;
	}	
	return ;
}
/*中序遍历二叉树T,并将其线索化,head为头指针
在线索二叉树中头结点lchild左孩子指向二叉树的根结点,
rchild右孩子指向中序遍历时访问的最后一个结点;
二叉树的中序遍历序列中第一个结点的lchild指针和最后一个孩子的rchild指向头结点 
*/
void InOrderThreading(BiTree *head,BiTree T)
{
	*head=(BiTree)malloc(sizeof(BiTNode));
	if(!*head)/*如果创建失败*/
		return;
	/*初始化头结点*/ 
	(*head)->LTag=Link;
	(*head)->RTag=Thread;
	(*head)->rchild=*head;/*头指针回指*/
	
	if(!T)/*对传入第2个参数进行合法性检测,并采取相应处理,当T为空时*/
	{
		(*head)->lchild=(*head);
	}
	else
	{
		(*head)->lchild=T;//当T为非空时头结点指向二叉树的根结点T
		pre=(*head);
		
		InThreading(T);
		
		/*对最后一个结点线索化*/
		pre->RTag=Thread;
		pre->rchild=*head;
		(*head)->rchild=pre;/*头结点指向中序遍历最后一个结点*/	
	}	 
}
Ejemplo n.º 4
0
 /* bo6-3.c 二叉树的二叉线索存储(存储结构由c6-3.h定义)的基本操作,包括算法6.5~6.7 */
 void CreateBiThrTree(BiThrTree *T)
 { /* 按先序输入线索二叉树中结点的值,构造线索二叉树T。0(整型)/空格(字符型)表示空结点 */
   TElemType ch;
   scanf(form,&ch);
   if(ch==Nil)
     *T=NULL;
   else
   {
     *T=(BiThrTree)malloc(sizeof(BiThrNode)); /* 生成根结点(先序) */
     if(!*T)
       exit(OVERFLOW);
     (*T)->data=ch; /* 给根结点赋植 */
     CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */
     if((*T)->lchild) /* 有左孩子 */
       (*T)->LTag=Link; /* 给左标志赋值(指针) */
     CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */
     if((*T)->rchild) /* 有右孩子 */
       (*T)->RTag=Link; /* 给右标志赋值(指针) */
   }
 }

 BiThrTree pre; /* 全局变量,始终指向刚刚访问过的结点 */
 void InThreading(BiThrTree p)
 { /* 通过中序遍历进行中序线索化,线索化之后pre指向最后一个结点。算法6.7 */
   if(p) /* 线索二叉树不空 */
   {
     InThreading(p->lchild); /* 递归左子树线索化 */
     if(!p->lchild) /* 没有左孩子 */
     {
       p->LTag=Thread; /* 左标志为线索(前驱) */
       p->lchild=pre; /* 左孩子指针指向前驱 */
     }
     if(!pre->rchild) /* 前驱没有右孩子 */
     {
       pre->RTag=Thread; /* 前驱的右标志为线索(后继) */
       pre->rchild=p; /* 前驱右孩子指针指向其后继(当前结点p) */
     }
     pre=p; /* 保持pre指向p的前驱 */
     InThreading(p->rchild); /* 递归右子树线索化 */
   }
 }
Ejemplo n.º 5
0
/*
中序遍历线索化
*/
void InThreading(BiThrTree T)
{
	if(T==NULL)
		return ;
	InThreading(T->lchild);
	printf("%c ", T->data);	
	if(T->lchild == NULL)	
	{
		T->LTag = Thread;
		T->lchild = pre;
	}
	if(pre->rchild == NULL)		
	{
		pre->RTag = Thread;
		pre->rchild = T;
	}
	pre = T;                  
	InThreading(T->rchild);
}
Ejemplo n.º 6
0
  /* 0(整型)/空格(字符型)表示空结点 */
  TElemType h;
#if CHAR
  scanf("%c",&h);
#else
  scanf("%d",&h);
#endif
  if(h==Nil)
    *T=NULL;
  else
  {
    *T=(BiThrTree)malloc(sizeof(BiThrNode));
    if(!*T)
      exit(OVERFLOW);
    (*T)->data=h; /* 生成根结点(先序) */
    CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树 */
    if((*T)->lchild) /* 有左孩子 */
      (*T)->LTag=Link;
    CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树 */
    if((*T)->rchild) /* 有右孩子 */
      (*T)->RTag=Link;
  }
  return OK;
}
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; /* 前驱右孩子指针指向后继(当前结点p) */
    }
    pre=p; /* 保持pre指向p的前驱 */
    InThreading(p->rchild); /* 递归右子树线索化 */
  }
}
Ejemplo n.º 7
0
/*
 *	二叉树线索化中序递归函数
 *	更改空指针
 * */
void InThreading(BiThrTree p){
	BiThrNode *pre;
	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;
		InThreading(p->rchild);
	}
}
/*中序线索化*/
void InThreading(BiTree T)
{
	if(T)
	{
		InThreading(T->lchild);
		/*当没有左孩子时前驱线索*/
		if(!T->lchild)
		{
			T->LTag=Thread;
			T->lchild=pre;	
		}
		/*当没有右孩子时后继线索*/
		if(!pre->rchild)
		{
			pre->RTag=Thread;
			pre->rchild=T;
		}
		
		pre=T;/* 保持pre指向前驱 */
		InThreading(T->rchild);
	}
}
Ejemplo n.º 9
0
void InThreading(ptree pHead,ptree *pPre)
{
	ptree pCur=pHead;
	//ptree (*pPre); //ptree (*pPre)=pCur (totally wrong no need to set value)
	if(pCur)
	{
		InThreading(pCur->leftchild,pPre);		
		if(!pCur->leftchild)
		{
			pCur->Lflag=Thread;
			pCur->leftchild=(*pPre);
		}
		
		if(!(*pPre)->rightchild)
		{
			(*pPre)->Rflag=Thread;
			(*pPre)->rightchild=pCur;
		}	
		
		(*pPre)=pCur;//mark the (*pPre)
		InThreading(pHead->rightchild,pPre);		
	}
}
Ejemplo n.º 10
0
/* 中序遍历进行中序线索化 */
void InThreading(BiThrTree p)
{
    if (p)
    {
        InThreading(p->lchild); // 递归遍历左子树

        if (!p->lchild) // 如果该结点没有左孩子,则设置前驱
        {
            p->lchild = pre;
            p->LTag = Thread; // 设置标记
        }

        if (!pre->rchild) // 如果它的前驱结点没有右孩子,则设置后继
        {
            pre->rchild = p;
            pre->RTag = Thread; // 设置标记
        }

        pre = p; // 始终记录刚刚访问的结点

        InThreading(p->rchild); // 递归遍历右子树
    }
}
Ejemplo n.º 11
0
void InThreading(BiThrTree p)
{
	BiThrTree pre;
	if(p)	
	{
		pre=p;//保存前驱结点
		InThreading(p->lchild);//左子树线索化

		if(!p->lchild)//前驱结点
		{
			p->LTag=Thread;
			p->lchild=pre;
		}

		if(!pre->rchild)//后继结点
		{
			pre->RTag=Thread;
			pre->lchild=p;
		}

		pre=p;//保持pre指向p的前驱
		InThreading(p->rchild);//线索化右子树
	}
}//InThreading
Ejemplo n.º 12
0
//	中序遍历线索化
void InThreading(BiTree T)
{
	if( T )
	{
		InThreading(T->lchild);		//	递归左孩子线索化

		if( !T->lchild )	//	如果该节点没有左孩子,设置ltag为Thread,
							//	并把lchild指向刚刚访问的结点
		{
			T->ltag = Thread;
			T->lchild = pre;
		}

		if( !pre->rchild )
		{
			pre->rtag = Thread;
			pre->rchild = T;
		}

		pre = T;

		InThreading(T->rchild);		//	递归又孩子线索化
	}
}
Ejemplo n.º 13
0
int InOrderThreading(BiThrTree *Thrt,BiThrTree T) {
    if(!(*Thrt = (BiThrTree)malloc(sizeof(BiThrNode))))
        exit(-1);
    (*Thrt)->ltag = Link;
    (*Thrt)->rtag = Thread;
    (*Thrt)->rchild = *Thrt;
    if(!T)
        (*Thrt)->lchild = *Thrt;
    else {
        (*Thrt)->lchild = T;
        pre = *Thrt;
        InThreading(T);
        pre->rchild = *Thrt;
        pre->rtag = Thread;
        (*Thrt)->rchild = pre;
    }
    return 1;
}
Ejemplo n.º 14
0
Status InOrderThreading(BiThrTree *Thrt, BiThrTree T) { 
    *Thrt = (BiThrTree) malloc(sizeof(BiThrNode));
    if (!*Thrt)
        exit(OVERFLOW);
    (*Thrt)->LTag = Link; 
    (*Thrt)->RTag = Thread;
    (*Thrt)->rchild = *Thrt; 
    if (!T) 
        (*Thrt)->lchild = *Thrt;
    else {
        (*Thrt)->lchild = T;
        pre = *Thrt;
        InThreading(T); 
        pre->rchild = *Thrt;
        pre->RTag = Thread; 
        (*Thrt)->rchild = pre;
    }
    return OK;
}
Ejemplo n.º 15
0
//test---------------
void test(void)
{
	BiThrTree T;

	CreateBiTree(&T);

//	pre = T;
//	PreOrderTraverse(T);
//	printf("\n");

	pre = T;
	InThreading(T);
	//InOrderTraverse_Thr(T);
	printf("\n");

//	pre = T;
//	PostOrderTraverse(T);
//	printf("\n");
}
Ejemplo n.º 16
0
 void InOrderThreading(BiThrTree *Thrt,BiThrTree T)
 { /* 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。算法6.6 */
   *Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
   if(!*Thrt) /* 生成头结点不成功 */
     exit(OVERFLOW);
   (*Thrt)->LTag=Link; /* 建头结点,左标志为指针 */
   (*Thrt)->RTag=Thread; /* 右标志为线索 */
   (*Thrt)->rchild=*Thrt; /* 右指针回指 */
   if(!T) /* 若二叉树空,则左指针回指 */
     (*Thrt)->lchild=*Thrt;
   else
   {
     (*Thrt)->lchild=T; /* 头结点的左指针指向根结点 */
     pre=*Thrt; /* pre(前驱)的初值指向头结点 */
     InThreading(T); /* 中序遍历进行中序线索化,pre指向中序遍历的最后一个结点 */
     pre->rchild=*Thrt; /* 最后一个结点的右指针指向头结点 */
     pre->RTag=Thread; /* 最后一个结点的右标志为线索 */
     (*Thrt)->rchild=pre; /* 头结点的右指针指向中序遍历的最后一个结点 */
   }
 }
Ejemplo n.º 17
0
void InOrderThreading( BiTree *p, BiTree T )
{
	*p = (BiTree)malloc(sizeof(BiTNode));
	(*p)->ltag = Link;
	(*p)->rtag = Thread;
	(*p)->rchild = *p;
	if( !T )
	{
		(*p)->lchild = *p;
	}
	else
	{
		(*p)->lchild = T;
		pre = *p;
		InThreading(T);
		pre->rchild = *p;
		pre->rtag = Thread;
		(*p)->rchild = pre;
	}
}
Ejemplo n.º 18
0
Status InOrderThreading(BiThrTree *Thrt,BiThrTree T)
{ /* 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。*/
  *Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
  if(!*Thrt)
    exit(OVERFLOW);
  (*Thrt)->LTag=Link; /* 建头结点 */
  (*Thrt)->RTag=Thread;
  (*Thrt)->rchild=*Thrt; /* 右指针回指 */
  if(!T) /* 若二叉树空,则左指针回指 */
    (*Thrt)->lchild=*Thrt;
  else
  {
    (*Thrt)->lchild=T;
    pre=*Thrt;
    InThreading(T); /* 中序遍历进行中序线索化 */
    pre->rchild=*Thrt;
    pre->RTag=Thread; /* 最后一个结点线索化 */
    (*Thrt)->rchild=pre;
  }
  return OK;
}
Ejemplo n.º 19
0
/*
 *	二叉树线索化
 *	添加头结点
 *	@param	BiThrTree 为空指针,函数中分配空间,做线索二叉树的头结点
 *	@return	failed -1 succeed 1
 * */
Status InOrderThreading(BiThrTree Thrt,BiThrTree T)
{
	BiThrNode *pre;
	if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode))))		//添加头结点
		exit(OVERFLOW);
	Thrt->LTag=Link;
	Thrt->RTag=Thread;
	Thrt->rchild=Thrt;


	if(!T)
		Thrt->lchild=Thrt;																
	else
	{
		Thrt->lchild=T;
		pre=Thrt;
		InThreading(T);
		pre->rchild=Thrt;
		pre->RTag=Thread;
		Thrt->lchild=pre;
	}
	return OK;
}
Ejemplo n.º 20
0
//中序线索化二叉树
Status InOrderTraverse(BiThrTree &btt,BiThrTree T)
{
	BiThrTree pre;
	btt=(BiThrTree)malloc(sizeof(BiThrNode));
	if(!btt)exit(OVERFLOW);//

	//建立头结点
	btt->LTag=Link;
	btt->RTag=Link;

	if(!T)btt->lchild=btt;//如果二叉树为空,则做指针回指
	else
	{
		btt->lchild=T;
		pre=btt;
		InThreading(T);//中序遍历建立中序线索化

		//将最后一个节点线索化
		pre->rchild=btt;
		pre->RTag=Thread;
		btt->rchild=pre;
	}
	return OK;
}