目录

在中序线索二叉树里找指定节点在后序的前驱节点

在中序线索二叉树里找指定节点在先序的后继节点


在中序线索二叉树里找指定节点在后序的前驱节点

/*** 用二叉树链式存储实现 王道 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(在中序线索二叉树里找指定节点在后序的前驱节点)+ 拓展(在中序线索二叉树里找指定节点在先序的后继节点)相关推荐

  1. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  2. [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 ...

  3. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  4. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

    在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...

  5. 【23考研】计算机408数据结构代码题强化阶段划重点(王道书)

    视频链接:[23考研]10分钟带你整理408数据结构强化阶段代码题复习重点 本篇只适合考408的同学,请自主命题的同学自觉右上角×掉 因为王道书为了照顾自主命题的同学,所以很多算法也给出了代码实现,实 ...

  6. 二叉树的常用操作(节点的后继节点)

    0. 中序遍历时的后继节点(successor) 如当前节点为 x,其后继节点包含两种情况: 右子树非空,则其后继为其右子树的最左节点(最小值所在的节点) 右子树为空,则其后继为该节点的最底层的祖先节 ...

  7. c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...

    本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #include #include ...

  8. 由中序和后序(前序)序列求前序(后序)序列

    已知二叉树的中序和后序(前序)序列可以唯一确定一颗二叉树,例如, 中序序列:1 2 3 4 5 6 后序序列:3 4 2 6 5 1 可以唯一确定一颗二叉树,如下图: 思路是这样的:     我们知道 ...

  9. 王道书 P335 T05

    /*** 王道书 P335 T05** ①算法思想* 使用快排的思想,low是每次枢轴的最终确定位置,* 从小到大排序,如果low + 1 等于 k 的话,那么 low + 1 位置的元素就是这个序列 ...

  10. 王道书 P217 T02 + 拓展 (判断无向连通图是否有环)

    /*** 王道书 P217 T02 + 拓展 :判断无向连通图是否有环** ①算法思想* 若是一棵树,首先是连通的,判断连通的方法:* 1° 如果只调用了一次Traverse里面的DFS()或者BFS ...

最新文章

  1. 手把手教你使用zabbix监控nginx
  2. golang异步协程调度原理
  3. 微软撤回了开放面部识别数据集,出于法律原因
  4. python中ThreadLocal的理解与使用
  5. 会计师要计算机学的,会计师要具备哪些能力条件
  6. 机器学习常见算法个人总结(面试用)
  7. Android的init过程:init.rc解析流程
  8. Qt QObject::connect: Parentheses expected错误原因
  9. 哲学家就餐问题python_Python实现哲学家就餐问题实例代码
  10. Gitlab Merge Request Builder Plugin 配置小记
  11. jop怎么读音英语怎么说_“春晚”英语怎么说?
  12. Windows下Qt Creator设置IDE菜单字体样式
  13. c程序在solaris与linux的不同,在Solaris上编译应用程序时,在Linux上使用Valgrind也会有所帮助吗?...
  14. java的text函数,excel text函数以及相关的函数使用方法
  15. Pandas的read_excel()函数读取excel时遇到身份证含空值(pandas识别nan为float类型)自动变成科学计数法的解决办法
  16. 面试关于jvm、dvm和art虚拟机区别
  17. Windows 11 有望支持苹果 M1 Mac?微软和高通的秘密协议即将到期
  18. eclipse juno(4.2) 集成 maven 插件
  19. win10电脑连接蓝牙请检查PIN并重新连接
  20. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

热门文章

  1. mysql数据库查询总条数
  2. 域服务器桌面墙纸,与大家分享windows 10 加域后统一桌面壁纸无法生效问题的解决办法...
  3. php curl getinfo详解,php curl getinfo
  4. Google预训练语言模型T5
  5. [51nod 1051 最大子矩阵和]前缀和+dp
  6. linux c: 静态库和动态库的生成和使用
  7. 怎么使用计算机公式,在excel怎么运用计算公式进行运算?
  8. jquery M97-datepicker日历控件
  9. Python网站服务器搭建,python 最快速搭建一个网站
  10. 迈卡名车茂深度访谈信达名车——宋丙刚:自信坚韧 坚持不懈