05-5.3.2_3 在线索二叉树中找前驱后继

👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com


喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

中序线索二叉树找中序后继

在中序线索二叉树中找到指定结点 *p中序后继 next

  1. p->rtag == 1,则 next = p->rchild
  2. p->rtag == 0,则 p 必有右孩子,next 就是 p 的右子树中,最左下角的结点mkkkkkkkkkkkkkkkk
// 找到以 p 为根的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p){
	// 循环找到最左下结点(不一定是叶子结点)
	while(p->ltag == 0) p = p->lchild;
	return p;
}

// 在中序线索二叉树中找到结点 p 的后继结点
ThreadNode *Nextnode(ThreadNode *p){
	// 右子树中最左下结点
	if(p->rtag == 0) return Firstnode(p->rchild);
	else return p->rchild;  // rtag == 1直接返回后继线索
}

// 对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)
void Inorder(ThreadNode *T){
	for(ThreadNode *p = Firstnode(T); p != NULL; p = Nextnode(p)) 
			visit(p);
}

先序线索二叉树

找先序后继

在先序线索二叉树中找到指定结点 *p先序后继 next

  1. p->rtag == 1 ,则 next = p->rchild
  2. p->ratg == 0
    ……

找先序前驱

在先序线索二叉树中找到指定结点 *p先序前驱 pre

  1. p->ltag == 1 ,则 pre = p->lchild
  2. p->latg == 0
    先序遍历中,左右子树中的结点只可能是根的后继,不可能是前驱
  3. 如果能找到p的父结点,且p是左孩子——p的父结点即为其前驱
  4. 如果能找到p的父结点,且p是右孩子,其左兄弟为空——p的父结点即为其前驱
  5. 如果能找到p的父结点,且p是右孩子,其左兄弟非空——p的前驱为 左兄弟子树中 最后一个被先序遍历的结点

后序线索二叉树

找后序前驱

在后序线索二叉树中找到指定结点 *p后序前驱 pre

  1. p->ltag == 1 ,则 pre = p->lchild
  2. p->latg == 0, p必有左孩子
    • 若p有右孩子,则后序前驱为 右孩子
    • 如果p没有右孩子,则后序前驱为 左孩子

找后序后继

在后序线索二叉树中找到指定结点 *p后序后继 next

  1. p->rtag == 1 ,则 next = p->rchild
  2. p->ratg == 0, p必有右孩子
    后序遍历中,左右子树中的结点只可能是根的前驱,不可能是后继

该用三叉链表可以找到父结点

  1. 如果能找到 p 的父结点,且 p 是右孩子——p 的父结点即为其后继
  2. 如果能找到 p 的父结点,且 p 是左孩子,其右兄弟为空——p 的父结点即为其后继
  3. 如果能找到 p 的父结点,且 p 是左孩子,其右兄弟非空——p 的后继为 右兄弟子树中 第一个被后序遍历的结点
  4. 如果 p 是根结点,则 p 没有后序后继
  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Beast Cheng

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值