王道书 P150 T18(在中序线索二叉树里找指定节点在后序的前驱节点)+ 拓展(在中序线索二叉树里找指定节点在先序的后继节点)
目录
在中序线索二叉树里找指定节点在后序的前驱节点
在中序线索二叉树里找指定节点在先序的后继节点
在中序线索二叉树里找指定节点在后序的前驱节点
/*** 用二叉树链式存储实现 王道 P150 T18* ①算法思想* ①在中序线索二叉树里找指定节点在后序的前驱节点* ②在中序线索二叉树里找指定节点在先序的后继* 关于①:* 如果p有右孩子,那么p的右孩子就是p的前驱。* 如果p没有右孩子,但是有左孩子,那么p的左孩子就是p的前驱。* 但如果p是叶子节点:* 如果p是一个偏左行为的节点(想象成左下角的一个),那么它一定是第一个遍历的,他就不会有前驱。* 如果p是一个偏右行为的节点(想象成右下角的一个),那么它有可能有前驱,也有可能没有,得在这个节点的左边找一找。* 关于②:* 如果p有左孩子,那么p的左孩子就是p的后继。* 如果p没有左孩子,但是有右孩子,那么p的右孩子就是p的后继。* 但如果p是叶子节点:* 如果p是一个偏右行为的节点(想象成右下角的一个),那么它一定是最后一个遍历的,他就不会有后继。* 如果p是一个偏左行为的节点(想象成左下角的一个),那么它有可能有后继,也有可能没有,得在这个节点的右边找一找。*** ②算法设计*/#include <stdio.h>
#include <iostream>
#define MaxSize 100typedef struct ThreadBiTreeNode{int data;struct ThreadBiTreeNode *lchild,*rchild,*parent;//parent域指向双亲结点int ltag,rtag;int weight;//如果给叶子节点赋权值的话会用到
}ThreadBiTreeNode,*ThreadBiTree;//P150 T18
//①在中序线索二叉树里找指定节点在后序的前驱节点
ThreadBiTree InFindNodePostPre(ThreadBiTree p){if(p -> rtag == 0){//说明p一定有右孩子,那么p的前驱就是右孩子return p -> rchild;}else if(p -> ltag == 0){//如果p没有右孩子,但是有左孩子,那么p的前驱就是p的左孩子return p -> lchild;}else{//如果p是叶子节点:((注意为什么后序找前驱不用考虑这个情况?//因为不需要考虑到,要是在后序中p是叶子结点的话就可以直接return p -> ltag了。//这也正是在先序中找某个节点在后序中的前驱的麻烦之处。))//①如果p是一个偏左行为的节点(想象成左下角的一个),那么它一定是第一个遍历的,他就不会有前驱。if(p -> lchild == NULL)//p现在是叶子节点,所以p -> lchild == NULL 相当于p在中序序列中没有前驱,那么p在后序序列中也没有前驱return NULL;//②如果p是一个偏右行为的节点(想象成右下角的一个或者是右子树中的一个),那么它有可能有前驱,也有可能没有,得在这个节点的左边找一找。while(p -> lchild != NULL && p -> ltag == 1){//一直向上找直到找到一个点有左孩子//因为p是叶子节点,所以p -> lchild就是它在~中序~中的前驱,//这是一个一直向上找的过程,如果向上找的时候遇到某个节点他有左孩子,那么这个左孩子就是p在后序中的前驱p = p -> lchild;//一直在向上找}if(p -> ltag == 0)//说明是因为p->ltag!=1结束循环的,说明向上找到了一个节点,这个节点有左孩子,那么这个左孩子就是p的前驱。return p -> lchild;else//说明是因为p -> lchild == NULL 结束while的,那么这就是一个单支树,p就不会有前驱。return NULL;}
}
在中序线索二叉树里找指定节点在先序的后继节点
/*** 用二叉树链式存储实现 王道 P150 T18* ①算法思想* ①在中序线索二叉树里找指定节点在后序的前驱节点* ②在中序线索二叉树里找指定节点在先序的后继* 关于①:* 如果p有右孩子,那么p的右孩子就是p的前驱。* 如果p没有右孩子,但是有左孩子,那么p的左孩子就是p的前驱。* 但如果p是叶子节点:* 如果p是一个偏左行为的节点(想象成左下角的一个),那么它一定是第一个遍历的,他就不会有前驱。* 如果p是一个偏右行为的节点(想象成右下角的一个),那么它有可能有前驱,也有可能没有,得在这个节点的左边找一找。* 关于②:* 如果p有左孩子,那么p的左孩子就是p的后继。* 如果p没有左孩子,但是有右孩子,那么p的右孩子就是p的后继。* 但如果p是叶子节点:* 如果p是一个偏右行为的节点(想象成右下角的一个),那么它一定是最后一个遍历的,他就不会有后继。* 如果p是一个偏左行为的节点(想象成左下角的一个),那么它有可能有后继,也有可能没有,得在这个节点的右边找一找。*** ②算法设计*/#include <stdio.h>
#include <iostream>
#define MaxSize 100typedef struct ThreadBiTreeNode{int data;struct ThreadBiTreeNode *lchild,*rchild,*parent;//parent域指向双亲结点int ltag,rtag;int weight;//如果给叶子节点赋权值的话会用到
}ThreadBiTreeNode,*ThreadBiTree;//②在中序线索二叉树里找指定节点在先序的后继
ThreadBiTree InFindNodePrePost(ThreadBiTree p){if(p -> ltag == 0){//说明p一定有左孩子,那么p的后继就是右孩子return p -> lchild;}else if(p -> rtag == 0){//如果p没有左孩子,但是有右孩子,那么p的后继就是p的右孩子return p -> rchild;}else{//如果p是叶子节点://①如果p是一个偏右行为的节点(想象成右下角的一个),那么它一定是最后一个遍历的,他就不会有后继。if(p -> rchild == NULL)//p现在是叶子节点,所以p -> rchild == NULL 相当于p在中序序列中没有后继,那么p在先序序列中也没有后继return NULL;//②如果p是一个偏左行为的节点(想象成左下角的一个或者是左子树中的一个),那么它有可能有后继,也有可能没有,得在这个节点的右边找一找。while(p -> rchild != NULL && p -> rtag == 1){//一直向上找直到找到一个点有右孩子//因为p是叶子节点,所以p -> rchild就是它在~中序~中的后继,//这是一个一直向上找的过程,如果向上找的时候遇到某个节点他有右孩子,那么这个右孩子就是p在先序中的后继p = p -> rchild;//一直在向上找}if(p -> ltag == 0)//说明是因为p->ltag!=1结束循环的,说明向上找到了一个节点,这个节点有右孩子,那么这个右孩子就是p的后继。return p -> rchild;else//说明是因为p -> rchild == NULL 结束while的,那么这就是一个单支树,p就不会有后继。return NULL;}
}
王道书 P150 T18(在中序线索二叉树里找指定节点在后序的前驱节点)+ 拓展(在中序线索二叉树里找指定节点在先序的后继节点)相关推荐
- 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)
1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...
- [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点
Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...
- 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点
Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...
- 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )
在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...
- 【23考研】计算机408数据结构代码题强化阶段划重点(王道书)
视频链接:[23考研]10分钟带你整理408数据结构强化阶段代码题复习重点 本篇只适合考408的同学,请自主命题的同学自觉右上角×掉 因为王道书为了照顾自主命题的同学,所以很多算法也给出了代码实现,实 ...
- 二叉树的常用操作(节点的后继节点)
0. 中序遍历时的后继节点(successor) 如当前节点为 x,其后继节点包含两种情况: 右子树非空,则其后继为其右子树的最左节点(最小值所在的节点) 右子树为空,则其后继为该节点的最底层的祖先节 ...
- c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...
本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #include #include ...
- 由中序和后序(前序)序列求前序(后序)序列
已知二叉树的中序和后序(前序)序列可以唯一确定一颗二叉树,例如, 中序序列:1 2 3 4 5 6 后序序列:3 4 2 6 5 1 可以唯一确定一颗二叉树,如下图: 思路是这样的: 我们知道 ...
- 王道书 P335 T05
/*** 王道书 P335 T05** ①算法思想* 使用快排的思想,low是每次枢轴的最终确定位置,* 从小到大排序,如果low + 1 等于 k 的话,那么 low + 1 位置的元素就是这个序列 ...
- 王道书 P217 T02 + 拓展 (判断无向连通图是否有环)
/*** 王道书 P217 T02 + 拓展 :判断无向连通图是否有环** ①算法思想* 若是一棵树,首先是连通的,判断连通的方法:* 1° 如果只调用了一次Traverse里面的DFS()或者BFS ...
最新文章
- 手把手教你使用zabbix监控nginx
- golang异步协程调度原理
- 微软撤回了开放面部识别数据集,出于法律原因
- python中ThreadLocal的理解与使用
- 会计师要计算机学的,会计师要具备哪些能力条件
- 机器学习常见算法个人总结(面试用)
- Android的init过程:init.rc解析流程
- Qt QObject::connect: Parentheses expected错误原因
- 哲学家就餐问题python_Python实现哲学家就餐问题实例代码
- Gitlab Merge Request Builder Plugin 配置小记
- jop怎么读音英语怎么说_“春晚”英语怎么说?
- Windows下Qt Creator设置IDE菜单字体样式
- c程序在solaris与linux的不同,在Solaris上编译应用程序时,在Linux上使用Valgrind也会有所帮助吗?...
- java的text函数,excel text函数以及相关的函数使用方法
- Pandas的read_excel()函数读取excel时遇到身份证含空值(pandas识别nan为float类型)自动变成科学计数法的解决办法
- 面试关于jvm、dvm和art虚拟机区别
- Windows 11 有望支持苹果 M1 Mac?微软和高通的秘密协议即将到期
- eclipse juno(4.2) 集成 maven 插件
- win10电脑连接蓝牙请检查PIN并重新连接
- Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码
热门文章
- mysql数据库查询总条数
- 域服务器桌面墙纸,与大家分享windows 10 加域后统一桌面壁纸无法生效问题的解决办法...
- php curl getinfo详解,php curl getinfo
- Google预训练语言模型T5
- [51nod 1051 最大子矩阵和]前缀和+dp
- linux c: 静态库和动态库的生成和使用
- 怎么使用计算机公式,在excel怎么运用计算公式进行运算?
- jquery M97-datepicker日历控件
- Python网站服务器搭建,python 最快速搭建一个网站
- 迈卡名车茂深度访谈信达名车——宋丙刚:自信坚韧 坚持不懈