二叉树中序遍历线索化 C++ 递归实现
二叉树中序遍历线索化
中序遍历有一个特点,只要不是叶子节点,遍历的时候左孩子一定是当前节点的上一个访问节点;右孩子一定是当前节点的下一个访问节点。
如果把叶子节点的左右孩子都利用起来,把空的左孩子做成前驱线索,右孩子做成后继线索,就可以实现整个二叉树每一个节点的左孩子就是它的上一个访问节点,右孩子就是它的下一个访问节点。
重点需要处理的就是第一个访问节点的前驱节点以及最后一个访问节点的后继节点,只需要创建一个新节点作为中介就行!
代码:
#include<iostream>
using namespace std;
typedef struct BiTNode
{string data;BiTNode* lchild, * rchild;int ltag , rtag ;//0代表孩子,1代表线索
};
BiTNode* pre = NULL;//后面第一次线索化的时候必须给初值
string s;
void creatBiTree(BiTNode*& p)//参数传指针引用
{string S;cout << "请按照先序遍历的顺序输入数据,#代表NULL:";cin >> S;if (S == "#"){(p) = NULL;}else{p = new BiTNode();(p)->data = S;p->ltag = 0;p->rtag = 0;creatBiTree(p->lchild);creatBiTree(p->rchild);}
}
void inOrder(BiTNode* p)//中序遍历线索化
{if (p){inOrder(p->lchild);if (p->lchild == NULL)//左孩子递归,一直到该节点没有左孩子,就把左孩子做成前驱线索{p->lchild = pre;p->ltag = 1;}if (pre && !(pre->rchild))//看看上一个访问节点是否有右孩子,没有右孩子的话设置上一个访问节点的后继节点为当前节点{pre->rchild = p;//因为每次都不知道下一个访问的节点将会是什么,所以每次只能设置上一个节点的后继节点pre->rtag = 1;}pre = p;//设置p为上一次访问的节点inOrder(p->rchild);}
}
void headOrder(BiTNode*& T, BiTNode* p)//p是二叉树,T是头节点
{T = new BiTNode();//创建一个新节点的目的是作为第一个访问节点的前驱节点,同时也作为最后访问节点的后继节点。T->ltag = 0;T->rtag = 1;T->rchild = T;if (!p)//如果二叉树为空,就不需要线索化了{T->lchild = T;}else//不为空就把新节点的左孩子指向该二叉树的头节点{T->lchild = p;T->ltag = 1;pre = T;inOrder(p);//出来之后的pre是二叉树访问的最后一个节点,将他的后继设为头节点pre->rtag = 1;pre->rchild = T;T->rchild = pre;}
}
int main()
{BiTNode* S;BiTNode* p;creatBiTree(S);headOrder(p, S);
}
二叉树中序遍历线索化 C++ 递归实现相关推荐
- 二叉树中序遍历线索化
#include<stdio.h>typedef struct ThreadNode{int data;struct ThreadNode *lchild,*rchild;int ltag ...
- 非递归,不用栈实现二叉树中序遍历
最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...
- 二叉树中序遍历(递归法和迭代法(非递归法))——C++
声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 二叉树的遍历有前序遍历.中序遍历.后序遍历和层次遍历,其中二叉树基本知识点可以参考博主上篇博客(二叉树基本知识点图文介 ...
- 数据结构二叉树中序遍历递归和非递归算法
2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...
- 详细图解二叉树中序遍历(非递归C++)LeetCode94
详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...
- 【C语言】二叉树中序遍历(递归和非递归)算法
二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...
- Java 二叉树中序遍历(递归/非递归)
Java 二叉树中序遍历(递归/非递归) 中序遍历 代码实现 递归方式 非递归方式 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访 ...
- 基本题型记录-二叉树中序遍历
由于本人基础较差,所以针对部分题型做一个记录,以免自己忘记 1.二叉树中序遍历 这个遍历方法可以搜一下博客上很多讲解,这里主要是记录一下代码实现,以下面的二叉树为例子 结果应该是 2.迭代法 2.1 ...
- 二叉树中序遍历的非递归算法
根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...
最新文章
- 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统
- 从Image Caption Generation理解深度学习
- 查看网页服务器搭建方式(Python3)
- 【华科考研机试题】二叉树遍历(递归版 详细注释)
- three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发
- 理论基础 —— 图 —— 图的存储结构
- javascript-注释-字符串数据类型的方法
- 【转】Rhythm Of The Rain 雨的旋律
- Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题
- 如何在苹果Mac上设置实时文本(RTT)?
- 解决办法:configure: error: C compiler cannot create executables错误
- MySQL 函数:IF(expr,v1,v2) 判断
- 【Keil5】关于keli5使用ST-link下载的配置方法
- 宽带网速如何测试软件,怎么测网速(教你精准测速的方法)
- JavaScript 设计模式之组合模式
- MySQL多表左右连接查询
- group by 和where可以一起使用吗
- “3点钟无眠区块链”的前世今生
- keil的c语言基础,KeilC单片机C语言应用研究入门基础篇要点S.doc
- 2018-07-13心情日记
热门文章
- 配置H3C华三设备远程管理(SSH、Telnet等)
- element 菜单修复02-王荣荣如此唯美
- Navicat Premium15 手心输入法中文输入某些字符闪退
- lol显示进入观战服务器失败怎么办,英雄联盟不能观战 LOL观战进不去解决方法...
- 五款朴实无华却又能极大提升办公效率的软件
- 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!
- 申请FSC认证,哪种方案适合你?
- 华为android能关闭吗,用华为手机,这3个功能最好立马关掉!不然手机会越来越卡...
- VMware虚拟机NAT模式连不上网,无法启动VMware DHCP Service 服务
- 我们失去了,我们又没有失去什么