通过中序线索二叉树找某节点的后续前驱☆

题目:写出在中序线索二叉树里查找指定节点在后序的前驱结点的算法
分析:
        在后序序列中,若节点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱。若节点p左右子女均无,
        设其中序左线索指向某祖先节点f(p是f右子树中按中序遍历的第一个节点),若f有左子女,则其左子女是节点p在后序中的前驱;
        若f无左子女,则顺其前驱找双亲的双亲,一直找到双亲有左子女(此时左子女是p的前驱)。还有一种情况,若p是中序遍历的第
        一个节点,则节点p在中序和后序下均没有前驱。

要考虑到所有的情况确实不容易,先记下吧

代码如下:

struct biTree {
	char data;
	struct biTree *lchild;
	struct biTree *rchild;
	int ltag, rtag;
};
#include <stdio.h>
#include <stdlib.h>
biTree *findPre(biTree *T,biTree *p) {//返回前驱结点
	struct biTree *f;
	if (p->rchild&&p->rtag==0) {//若该节点有右孩子,那么右子女是其前驱
		return p->rchild;
	}
	else if(p->ltag==0&&p->lchild) {//若该节点只有左子女则左子女是其前驱
		return p->lchild;
	}
	else {
		f = p->lchild;//此时左线索指向某祖先节点
		while (f&&f->ltag) {//如果该祖先节点没有左子女,继续找前驱
			f = f->lchild;
		}
		if (f) {
			return f->lchild;
		}
		else {
			return NULL;
		}
	}
}
int main() {
	struct biTree *T = (struct biTree *)malloc(sizeof(struct biTree));
	biTree *create(biTree *);
	T = create(T);
	void inThread(biTree *,biTree *);
	inThread(T,NULL);//中序遍历建立线索

	struct biTree *p = T->lchild->rchild->rchild,*pre=NULL;//手动指定一个节点
	pre=findPre(T,p);
	if (pre) {
		printf("节点p的前驱结点值为:%c",pre->data);
	}
	else {
		printf("节点p没有前驱结点");
	}
	return 0;
}

我们是如何一步步落后于别人的,自己心里特别清楚,无非是从生活中一点点的差距开始的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值