线索树的前后继结点总结专题,看了很多论坛上面的文章

 先序遍历线索树

        先序遍历线索树的前驱

          先序的前驱: 1、该结点是根,不存在前驱 2、该结点是左孩子,前驱是父节点。 3、该结点是右孩子且没有左孩子,前驱为父结点。 4、该结点为右孩子,且存在左孩子,前驱为左孩子子树中的先序最后遍历结点。 

        用非递归的先序遍历来实现,一个p作为工作指针,一个pre指向前驱。

        先序遍历线索树的后继

//choose 1:
BiThrNode *PreNext(BiThrNode *p)
 {
   BiThrNode *q;
   if(p->Ltag==0) q=p->lchild;//如果没有线索化,返回左孩子结点
   else q=p->rchild;//如果线索化了,就直接返回rchild
   return q;
}

//choos 2:
BiThrTree *PreNext(BiThrThee *p)
{
	if(p->Rtag == 1)//如果线索化了,就直接返回rchild
		next = p->rchild;
//如果没有线索化,且左孩子结点不为空,则返回左孩子结点,若为空则返回右孩子结点
	else if(p->lchild){
        next = p->lchild;
    }else{
        next = p->rchild;
    }
	return next;
}

中序遍历线索树

   中序遍历线索树画图 

       中序遍历线索树结构体

    中序遍历线索化

中序线索树的二叉遍历

 

 

      中序遍历线索树的前驱 

//choose 1:
ThreadNode *PreNode(ThreadNode *p){
	if(p->ltag==1){
		p=p->lchild;
	}else{
		p=LastNode(p->lchild);
	}
	return p;
}
//找到以p为根的子树中,最后一个被中序遍历的结点,即就是左孩子的最右孩子结点就是中序遍历的前驱
ThreadNode *LastNode(ThreadNode *p){
	while(p->rtag==0){
		p=p->rchild;
	}
	return p;
}
//choose 2:
BiThrTree InPre(BiThrThee p)
{
	if(p->Ltag == 1)
		pre = p->LChild;
	else{
		for(q=p->LChild;q->Rtag==0;q=q->RChild)//这里代替了choose1的LastNode方法
			pre = q;
	}
	return pre;
}

        中序遍历线索树的后继

//choose 1:
ThreadNode *NextNode(ThreadNode *p){
	if(p->rtag==1){
		p=p->rchild;
	}else{
		p=FirstNode(p->rchild);
	}
	return p;
}
//找到以p为根的子树中,第一个被中序遍历的结点,即该节点右孩子的最左孩子结点
ThreadNode *FirstNode(ThreadNode *p){
	while(p->ltag==0){        
		p=p->lchild;
	}
	return p;
}
//choos 2:
BiThrTree InNext(BiThrThee p)
{
	if(p->Rtag == 1)
		next = p->RChild;
	else{
		for(q=p->RChild;q->Ltag==0;q=q->LChild)
			next = q;
	}
	return next;
}

后序遍历线索树 

        后序遍历线索树找前驱

BiThrTree PostPre(BiThrThee p)
{
	if(p->Ltag == 1)
		pre = p->LChild;
	else if(p->RChild){
		pre = p->RChild;
	}else{
		pre = p->LChild;
	}
	return pre;
}

        后序遍历线索树找后继

        后序遍历的后继: 1、该结点是根,不存在后继 2、该结点是右孩子,后继是父结点 3、该结点是左孩子且没有右孩子,后继是父结点 4、该结点是左孩子且存在右孩子,后继为右孩子子树中后序遍历第一个结点  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值