早上突然发现,我前天写的这个建立线索树并遍历的代码忘了发,今天补上,正好复盘一下

建立中序线索树

附设指针pre,p
p遍历完之后,pre=p,也就是pre是遍历结点p的前驱,p是pre的后继

如果p的左孩子为空,那么p-lchild=pre
如果pre的右孩子为空,&&pre!=NULL,pre->rchild=p

中序的前驱,

如果ltag=1,左孩子就是前驱
如果ltag=0,左孩子的最右下结点

中序的后继,

如果rtag=1,右孩子就是后继
如果rtag=0,右孩子的最左下结点

还要注意,前序遍历的前驱和后序遍历的后继借助二叉树是无法找到的
只能借用三叉链表,找到他的父节点,才有可能实现

中序借助线索遍历

建立循环,p不空,那么p就一直等于p的后继就可以实现
因为在上面,我们已经总结了后继的不同情况,可以写一个函数来实现
就在循环中调用函数就行了

我们还可以利用前驱,来实现中序的倒序遍历

#include<iostream>
using namespace std;typedef struct Treenode {int data;struct Treenode* lchild, * rchild;int ltag, rtag;
}Treenode, * Tree;Treenode* pre = NULL;//变遍历,边建立线索二叉树
void visit(Tree T) {if (T->lchild == NULL) {T->ltag = 1;T->lchild = pre;//第一个左孩子为空,前驱为null}if (pre != NULL && pre->rchild == NULL) {pre->rchild = T;//后继,就让pre的→指向ppre->rtag = 1;}pre = T;//保持在T的后面//只需考虑每次的visit,结点关系//最后一个结点需要有孩子指向NULL
}//中序线索化
void mid_order_(Tree& T) {if (T != NULL) {mid_order_(T->lchild);visit(T);mid_order_(T->rchild);}
}//中序线索化
void mid_order_build(Tree& T) {if (T != NULL) {mid_order_(T);pre->rchild = NULL;//处理最后一个结点pre->rtag = 1;/*if (pre->lchild == NULL)pre->rtag = 1;*///我觉得和这个是一个效果}
}//树的初始化
void InitTree(Tree &T) {T = NULL;
}//树的建立,递归建立,输入需要注意
//1 2 4 0 0 0 3 0 5 0 0
void buildTree(Tree& T) {T = new Treenode;int x;cin >> x;if (x == 0)T = NULL;else {T->data = x;T->ltag = T->rtag = 0;buildTree(T->lchild);buildTree(T->rchild);}
}//中序递归遍历
void midorder_circual(Tree T) {if (T != NULL) {midorder_circual(T->lchild);cout << T->data << " ";midorder_circual(T->rchild);}
}//返回一个树的最左下结点
Treenode* left_low(Tree T) {Treenode* s = T;while (s->ltag ==0) {//这里lchild不能作为判断标志,因为线索二叉树的任何一个结点lchild都不为NULL//必须用ltag来判断s = s->lchild;}return s;
}//返回树的最右下结点
Treenode* right_low(Tree T) {Treenode* s = T;while (s->rtag == 0)s = s->rchild;return s;
}//中序的后继
Treenode * node_behind(Tree T) {Treenode* p = T;if (p->rtag == 1)return p->rchild;//后继为右孩子结点else {//为右子树的最左下结点return left_low(p->rchild);}
}//中序的前驱
Treenode* node_pre(Tree T) {Treenode* p = T;if (p->ltag == 1)return p->lchild;else {//return right_low(p->lchild);}
}//中序线索树的遍历
void visit_midorder_(Tree T) {Treenode* p;for (p=left_low(T);p != NULL; p = node_behind(p))cout << p->data << " ";
}//中序线索树的倒序遍历
void visit_midorder_dao(Tree T) {Treenode* p = T;for (p = right_low(T); p != NULL; p = node_pre(p))cout << p->data << " ";
}int main() {Tree T;InitTree(T);buildTree(T);midorder_circual(T);//中序递归遍历cout << endl;mid_order_build(T);//中序线索化visit_midorder_(T);//中序线索树的遍历,利用后继遍历cout << endl;visit_midorder_dao(T);//中序线索树的倒序遍历return 0;
}

23王道——建立中序线索树,找前驱后继,并用其遍历相关推荐

  1. 中序线索树和后序线索树

    约定 Node* Bool Data Bool Node* lchild LTag data RTag rchild LTag=0 时lchild指向左儿子: LTag=1 时lchild指向前驱: ...

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

    题目:写出在中序线索二叉树里查找指定节点在后序的前驱结点的算法 分析:         在后序序列中,若节点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱.若节点p左右子女均无, ...

  3. 为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持?

    为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持? 首先要明确两点 先序线索二叉树的缺点:无法找到先序序列中某结点的前驱 后序线索二叉树的缺点:无法找到后序序列中某结点的后继 中 ...

  4. 在线索二叉树中找前驱后继

    中序线索二叉树找中序后继 中序线索化二叉树主要是为了访问运算服务的,这种遍历不再借助栈,因为它的结点中隐含了线索二叉树的前驱和后继信息. 利用线索二叉树,可以实现二叉树遍历的非递归算法.不含头结点的线 ...

  5. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  6. 线索树找*p的中序后继且中序遍历 二叉线索树

    //线索树找*p的中序后继且中序遍历 二叉线索树 #define thread 1 #define link 0 typedef struct Bt{char data;struct Bt *lc;/ ...

  7. 数据结构: 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继。 (2) 如何搜索指定结点的在前序下的后继。(3) 如何搜索指定结点的在后序下的后继。

    题目 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继. (2) 如何搜索指定结点的在前序下的后继. (3) 如何搜索指定结点的在后序下的后继. 分析 这是殷人昆& ...

  8. C语言实现二叉树的中序线索化及遍历中序线索二叉树

    C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...

  9. 线索二叉树:中序线索二叉树的遍历

    线索二叉树:中序线索二叉树的遍历 作者: 冯向阳时间限制: 1S章节: DS:树 截止日期: 2022-06-30 23:55:00 问题描述 : 目的:使用C++模板设计中序线索二叉树的抽象数据类型 ...

  10. 二叉树的遍历 中序线索二叉树

    文章目录 前言 一.中序遍历的特点:投影 二.中序线索二叉树 三.代码思路 三.代码 前言 在N个节点的二叉树中,每个节点有2个指针,所以一共有2N个指针,除了根节点以外,每一个节点都有一个指针从它的 ...

最新文章

  1. 【jQuery 区别】.click()和$(document).on(click,指定的元素,function(){});的区别
  2. java 读写文件[多种方法]
  3. 598. Range Addition II(Python)
  4. PHP中的__toString方法(实现JS里的链式操作)
  5. html 响应式布局 九宫格,两种方法实现响应式九宫格布局
  6. 交叉验证选择最佳参数_如何为您的公司选择最佳的身份验证即服务提供商
  7. 7nfs客户端没权限_cephfs: 用户态客户端lookup
  8. 重磅:达摩院医疗AI团队CVPR'20论文解读 | 凌云时刻
  9. JAVA入门_工具类_书籍借阅日期计算
  10. 中国土壤修复行业十四五专项调研及投资战略规划报告2022-2027年新版
  11. SXF2019集合遍历
  12. 如何修改路由器dns服务器,怎么修改路由器DNS地址
  13. 重磅!2021年国内Java培训机构排名十强出炉啦!
  14. 1945-计算弹跳高度
  15. 1997-2020年31省进出口总额
  16. 一张图看懂光圈、快门、感光度的意义 ​​​​
  17. unable to resolve module
  18. 马氏距离例题详解(全网最详细)
  19. 【java】关于java编程语言开发
  20. 祝贺一个逃离科研的博士

热门文章

  1. 菜肴百度百科html,酸汤鱼
  2. mgetnx redis_redis-cluster集群模式下使用pipeline,mget,mset批量操作
  3. Nodejs: redis客户端通过mset方法一次性批量写入多个key的值
  4. 2017百度之星资格赛 1001/hdu 6080 度度熊保护村庄
  5. web - 常见浏览器及内核
  6. 计算机连接网络是飞行模式怎么办,电脑网络设置只剩飞行模式怎么办?
  7. Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
  8. Zigbee智能开关和单火取电技术
  9. tm影像辐射定标_遥感图像辐射定标
  10. google地图android版,google地图