23王道——建立中序线索树,找前驱后继,并用其遍历
早上突然发现,我前天写的这个建立线索树并遍历的代码忘了发,今天补上,正好复盘一下
建立中序线索树
附设指针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王道——建立中序线索树,找前驱后继,并用其遍历相关推荐
- 中序线索树和后序线索树
约定 Node* Bool Data Bool Node* lchild LTag data RTag rchild LTag=0 时lchild指向左儿子: LTag=1 时lchild指向前驱: ...
- 通过中序线索二叉树找某节点的后续前驱☆
题目:写出在中序线索二叉树里查找指定节点在后序的前驱结点的算法 分析: 在后序序列中,若节点p有右子女,则右子女是其前驱,若无右子女而有左子女,则左子女是其前驱.若节点p左右子女均无, ...
- 为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持?
为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持? 首先要明确两点 先序线索二叉树的缺点:无法找到先序序列中某结点的前驱 后序线索二叉树的缺点:无法找到后序序列中某结点的后继 中 ...
- 在线索二叉树中找前驱后继
中序线索二叉树找中序后继 中序线索化二叉树主要是为了访问运算服务的,这种遍历不再借助栈,因为它的结点中隐含了线索二叉树的前驱和后继信息. 利用线索二叉树,可以实现二叉树遍历的非递归算法.不含头结点的线 ...
- 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树
在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...
- 线索树找*p的中序后继且中序遍历 二叉线索树
//线索树找*p的中序后继且中序遍历 二叉线索树 #define thread 1 #define link 0 typedef struct Bt{char data;struct Bt *lc;/ ...
- 数据结构: 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继。 (2) 如何搜索指定结点的在前序下的后继。(3) 如何搜索指定结点的在后序下的后继。
题目 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继. (2) 如何搜索指定结点的在前序下的后继. (3) 如何搜索指定结点的在后序下的后继. 分析 这是殷人昆& ...
- C语言实现二叉树的中序线索化及遍历中序线索二叉树
C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...
- 线索二叉树:中序线索二叉树的遍历
线索二叉树:中序线索二叉树的遍历 作者: 冯向阳时间限制: 1S章节: DS:树 截止日期: 2022-06-30 23:55:00 问题描述 : 目的:使用C++模板设计中序线索二叉树的抽象数据类型 ...
- 二叉树的遍历 中序线索二叉树
文章目录 前言 一.中序遍历的特点:投影 二.中序线索二叉树 三.代码思路 三.代码 前言 在N个节点的二叉树中,每个节点有2个指针,所以一共有2N个指针,除了根节点以外,每一个节点都有一个指针从它的 ...
最新文章
- 【jQuery 区别】.click()和$(document).on(click,指定的元素,function(){});的区别
- java 读写文件[多种方法]
- 598. Range Addition II(Python)
- PHP中的__toString方法(实现JS里的链式操作)
- html 响应式布局 九宫格,两种方法实现响应式九宫格布局
- 交叉验证选择最佳参数_如何为您的公司选择最佳的身份验证即服务提供商
- 7nfs客户端没权限_cephfs: 用户态客户端lookup
- 重磅:达摩院医疗AI团队CVPR'20论文解读 | 凌云时刻
- JAVA入门_工具类_书籍借阅日期计算
- 中国土壤修复行业十四五专项调研及投资战略规划报告2022-2027年新版
- SXF2019集合遍历
- 如何修改路由器dns服务器,怎么修改路由器DNS地址
- 重磅!2021年国内Java培训机构排名十强出炉啦!
- 1945-计算弹跳高度
- 1997-2020年31省进出口总额
- 一张图看懂光圈、快门、感光度的意义 ​​​​
- unable to resolve module
- 马氏距离例题详解(全网最详细)
- 【java】关于java编程语言开发
- 祝贺一个逃离科研的博士
热门文章
- 菜肴百度百科html,酸汤鱼
- mgetnx redis_redis-cluster集群模式下使用pipeline,mget,mset批量操作
- Nodejs: redis客户端通过mset方法一次性批量写入多个key的值
- 2017百度之星资格赛 1001/hdu 6080 度度熊保护村庄
- web - 常见浏览器及内核
- 计算机连接网络是飞行模式怎么办,电脑网络设置只剩飞行模式怎么办?
- Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
- Zigbee智能开关和单火取电技术
- tm影像辐射定标_遥感图像辐射定标
- google地图android版,google地图