4.20总结

今天有个函数运行的时候出错了,一直在找问题解决问题,然后简单复习了下线索二叉树

二叉树的存储表示

typedef struct BiThrNode
{
	TElemtype data;
	struct BiThrNode *lchild,*rchild;//左右孩子 
	int LTag,Rtag; //左右标志 
 } BiThrNode,*BiThrTree;

以这种节点结构构成二叉树的存储结构,叫线索链表,其中结点前驱和后继的指针,叫做线索。加上线索的二叉树称之为线索二叉树。对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化

以节点p为根的子树中序线索化

[算法步骤]

①如果p非空,左子树递归线索化。

②如果p的左孩子为空,则给p加上左线索,将其LTag置为1,让p的左孩子

指针指向pre (前驱) ;否则将p的LTag置为0。

③如果pre的右孩子为空,则给pre加上右线索,将其RTag置为1,让pre的右

孩子指针指向p (后继) ;否则将pre的RTag置 为0。

④将pre指向刚访问过的结点p,即pre=p。

⑤右子树递归线索化。
 

 void InThreading(BiThrTree p)
 {
 	if(p)
 	{
 		InThreading(p->lchild);
 		if(!p->lchild)
 		{
 			p->LTag=1;
 			p->lchild=pre;
		 }
		 else
		 {
		 	p->LTag=0;
		 }
		 if(!pre->rchild)
		 {
		 	pre->RTag=1;
		 	pre->rchild=p;
		 }
		 else
		 {
		 	pre->RTag=0;
		 }
		 pre=p;
		 InThreading(p->rchild );
	 }
  } 

带头结点的二叉树中序线索化

void InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
	Thrt=new BiThrNode;
	Thrt->LTag=0;
	Thrt->Rtag=1;
	Thrt->rchild=Thrt;
	if(!T)
	{
		Thrt->lchild=Thrt;
	}
	else
	{
		Thrt->lchild=T;
		pre=Thrt;
		InThreading(T);
		pre->rchild=Thrt;
		pre->RTag=1;
		Thrt->rchild=pre;
	}
}

遍历中序线索二叉树

[算法步骤]

①指针p指向根结点。

②p为非空树或遍历未结束时,循环执行以下操作:

  • 沿左孩子向下, 到达最左下结点*p,它是中序的第一个结点;
  • 访问*p
  • 沿右线索反复查找当前结点*p的后继结点并访问后继结点,直至右线索为0或者遍历结束;
  • 转向p的右子树。

void InOrderTraverse(BiThrTree T)
{
	p=T->lchild;
	while(p!=T)
	{
		while(p->LTag==0)
		{
			p=p->lchild;
		}
		printf("%d",p->data);
		while(p->RTag==1&&p->rchild!=T)
		{
			p=p->rchild;
			printf("%d",p->data);
		}
		p=p->rchild;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值