二叉樹的非遞歸遍歷(二)之線索二叉樹

 中序線索二叉樹的構造:

typedef struct TBNode
{
	int data;
	int ltag,rtag;
	TBNode *lchild;
	TBNode *rchild;
}TBTNode;
//通過中序遍歷對二叉樹線索化 
void InThread(TBTNode *p,TBTNode *&pre)
{
	if(p!=NULL)
	{
		InThread(p->lchild,pre);
		if(p->lchild==NULL)
		{
			p->lchild=pre;
			p->ltag=1;
		}
	
	        if(pre!=NULL&&pre->rchild==NULL)
	        {
                    pre->rchild=p;
		    pre->rtag=1;
	        }
	        pre=p;
	        InThread(p->rchild,pre); 
        }
}
//中序遍歷創建中序二叉樹 
void createInThread(TBTNode *root)
{
	TBTNode *pre=NULL;
	if(root!=NULL)
	{
		InThread(root,pre);
		pre->rchild=NULL;
		pre->rtag=1;
	}
} 
//找到中序遍歷中的第一個結點 
TBTNode *First(TBTNode *p)
{
	while(p->ltag==0)
		p=p->rchild;
	return p;
}
//找到中序遍歷下的後繼結點 
TBTNode *Next(TBTNode *p)
{
	if(p->rtag==0)
		return First(p->rchild);
	else
		return p->rchild;
} 

 

前序線索二叉樹:

//前序線索二叉樹的構造
void preThread(TBTNode *p,TBTNode *&pre)
{
	if(p!=NULL)
	{
		if(p->lchild==NULL)
		{
			p->lchild=pre;
			p->ltag=1;
		}
		if(pre!=NULL&&pre->rchild==NULL)
		{
			pre->rchild=p;
			pre->rtag=1;
		}
		pre=p;
		if(p->ltag==0)
			preThread(p->lchild,pre);
		if(p->rtag==0)
			preThread(p->rchild,pre);
	}
}

//在前序線索二叉樹上執行前序遍歷
void preorder(TBTNode *root)
{
	if(root!=NULL)
	{
		TBTNode *p=root;
		while(p!=NULL)
		{
			while(p->ltag==0)
			{
				Visit(p);
				p=p->lchild;
			}
			Visit(p);
			p=p->rchild;
		}
	}
}

 

後序線索二叉樹:

void postThread(TBTNode *p,TBTNode *&pre)
{
	if(p!=NULL)
	{
		postThread(p->lchild,pre);
		postThread(p->rchild,pre);
		if(p->lchild==NULL)
		{
			p->lchild=pre;
			p->ltag=1;
		}
		if(pre!=NULL&&pre->rchild==NULL)
		{
			pre->rchild=p;
			pre->rtag=1;
		}
		pre=p;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章