数据结构:线索二叉树

Threaded Binary Tree

二叉树的中序线索化

很显然前序和后续线索化也是差不多的~~~就是顺序变了一下

#define datatype int;
typedef struct node *ThreadBintree;
struct node{
	int ltag,rtag;
	datatype data;
	ThreadBintree left,right;
};

InThread(ThreadBintree BT)  //中序线索化 
{
	ThreadBintree pre;
	if(BT)
	{
		InThread(BT->left);
		if(BT->left==NULL) ltag=1;
		if(BT->right==NULL) rtag=1;
		if(pre)
		{
			if(pre->rtag==1)	pre->left=p;
			if(p->ltag==1) p->right=pre;
		}
		pre=p;
		InThread(BT->right);
	}
}

访问线索二叉树:查找+遍历

查找*p(中序线索二叉树)

1.查找*p的后继结点
思路:

  • 如果rtag==1 那么p->right就是后继结点
  • 如果rtag==0 p的右子树中第一个被访问的结点就是后继结点 也就是出现的左下结点(找到的这个左下结点ltag==0
ThreadBintree InOrderNext(ThreadBintree p)
{
   ThreadBintree q;
   if(p->rtag==1) return p->right;
   else
   {
   	q=p->right;
   	while(q->ltag==0)
   	{
   		q->left;
   	}
   }
   return q;
}

2.查找p的前趋结点

ThreadBintree InOrderLast(ThreadBintree p)
{
	ThreadBintree q;
	if(p->ltag==1) return p->left;
	else
	{
		q=p->left;
		while(q->rtag==0)
		{
			q->right;
		}
	}
	return q;
 } 

查找*p(后序线索二叉树)

1.寻找p的前趋(比较容易)
思路:

  • ltag==1 那么前趋为 p->left
  • ltag==0: p->rtag==0 前趋 p->rigtht 有右子树,那么前趋就是右子树; p->rtag==1 p->left没有右子树,前趋就是左子树;

2.寻找p的后继

  • p为根 无后继
  • p是parent右孩子 则后继为parent
  • p是左孩子,无右兄弟,后继为parent
  • p是左孩子,有右兄弟,那么后继为parent的右子树中第一个后序遍历到的结点(最左下的叶子结点)

遍历(中序线索二叉树)

思路:一直找结点p的后继结点并访问即可

TravelIn(ThreadBintree p)
{
	if(p)
	{
		while(p->ltag==0)   //找中序序列的开始结点
		p=p->left;
		
		do{
			printf("%t%d\n",p->data);
			p=InOrderNext(p);
		} while(p);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值