二叉树的遍历和线索二叉树
二叉树遍历
二叉树结点的定义
typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild;
}BiNode, *BiTree;
先序
递归算法
void PreOrder1(BiTree T){if(T!=NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}
非递归算法(栈实现)
SqStack S;
void PreOrder2(BiTree T){BiNode *p=T;SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){visit(p);Push(S, p);p=p->lchild;}else{Pop(S, p);p=p->rchild;}}return ;
}
中序
递归算法
void InOrder1(BiTree T){if(T!=NULL){PreOrder(T->lchild);visit(T);PreOrder(T->rchild);}
}
非递归算法
void InOrder2(BiTree T){BiNode *p=L;SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){Push(S, p);p=p->lchild;}else{Pop(S, p);visit(p);p=p->rchild;}}return ;
}
后序
递归算法
void PostOrder1(BiTree T){if(T!=NULL){PreOrder(T->lchild);PreOrder(T->rchild);visit(T);}
}
非递归算法
void PostOrder2(BiTree T){BiNode *p=L;//将要进栈的结点 //需要设置一个指向上一个输出点的指针,用来实现中间结点最后输出; BiNode *pre=NULL; SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){Push(S, p);p=p->lchild;}else{ GetTop(S, p);//取栈顶元素//若右孩子被访问过,一定是上一次访问的 if(p->rchild!=NULL&&p->rchild!=pre){p=p->rchild; }else{Pop(S, p);//出栈访问 visit(p); pre=p;//因为根据后序遍历某个点出栈,说明以这个点为根的//子树一定已经访问完了,无继续进栈结点,只能下一步从栈中找到后续进栈结点 p=NULL;}}}return ;
}
二叉树线索化
代码实质就是二叉树遍历过程!!!
结点定义
typedef struct ThreadNode{Elemtype data;struct ThreadNode* lchild, *rchild; int ltag, rtag;//线索标记
}ThreaNode, *ThreadTree ;
先序
递归算法
void PreThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){//当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;if(T->ltag==0){//先序是先修改,如不判断将死循环 PreThread1(T->lchild, pre);}PretThread1(T->rchild, pre);}
}
中序*
递归算法
void InThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){InThread1(T->lchild, pre);//类似于中序visit //当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;InThread1(T->rchild, pre);}
}
void CreateInThread(ThreadTree T){ThreadNode* pre=NULL;if(T!=NULL){InThread(T,pre);//想要pre指针改变,InThread1里pre设置引用 pre->rchild=NULL;pre->rtag=1;}
}
后序
递归算法
//visit部分与中序几乎不变
void PostThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){PostThread1(T->lchild, pre);PostThread1(T->rchild, pre);//当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;}
}
相关文章:
二叉树的遍历和线索二叉树
二叉树遍历 二叉树结点的定义 typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild; }BiNode, *BiTree; 先序 递归算法 void PreOrder1(BiTree T){if(T!NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);} } 非递归算法(栈实现…...
SpringBoot3 集成Junit4
目录 1. 确保项目中包含JUnit 4依赖添加JUnit 4依赖 2. 配置Spring Boot使用JUnit 4在测试类中使用RunWith注解 3. 编写测试代码4、总结 【扩展】RunWith(SpringRunner.class) 中SpringRunner的作用1. **加载 Spring 应用上下文(ApplicationContext)**2.…...
Scala的set的添加删减和查询
添加:最好用于不可变数组,因为它会产生新数组,而不是在原数组上进行修改。 在尾部添加元素 可变数组 删减:按元素值删除元素 - 查询:查询元素是否存在.contains package Test //Set //特点:元素是唯…...
基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)
摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…...
【spark面试题】RDD和DataFrame以及DataSet有什么异同
RDD(Resilient Distributed Dataset): 概念:可理解为分布式的列表。它的每个元素代表数据的一行,具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据,具有很强的灵活性。例如&#…...
[Python]关于Tensorflow+Keras+h5py+numpy一些骚操作备忘
起因:要在Anaconda使用Tensorflow和Keras框架 这里提前小结一下: 1,一定要注意Python、Tensorflow、Keras不同版本的对应关系。 2,交叉用conda install 和pip install安装依赖库可能容易出现问题,在Anaconda虚拟环境…...
深度学习:Transformer 详解
Transformer 详解 对于Transformer模型的详细解释,可以更深入地探讨其各个组成部分、工作原理、以及在自然语言处理任务中的应用方法。以下是对Transformer模型的一个更全面和详细的解释,包括其架构细节和关键技术: 1. 基本架构 Transform…...
jmeter 性能测试步骤是什么?
JMeter是一款流行的开源性能测试工具,用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时,通常需要遵循以下步骤: 确定测试目标:首先,明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…...
前端入门一之JS最基础、最基础语法
前言 JS是前端三件套之一,也是核心,本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点;这篇文章是本人大一学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。 文章目录 初体验输入输出语句变量和常量常量变量…...
解决Swp交换空间被占满问题
解决ubuntu交换空间被占满问题 step1: cat /proc/sys/vm/swappiness 60 step2: sudo sysctl vm.swappiness10 #临时修改 step3: sudo sh -c “echo “vm.swappiness10” >> /etc/sysctl.conf” step4: sysctl -p #生效...
草地景观中的土地覆被变化:将增强型大地遥感卫星数据组成、LandTrendr 和谷歌地球引擎中的机器学习分类与 MLP-ANN 场景预测相结合
目录 简介 方法 结论 代码1:影像集合 代码2: 随机森林和svm分类 结果 简介 了解草原生境在空间和时间上的动态对于评估保护措施的有效性和制定可持续管理方法至关重要,特别是在自然 2000 网络和欧洲生物多样性战略范围内。 根据遥感数据绘制的土地覆盖图对于了解植被…...
【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
字符串常量是用一对双引号括起来的字符序列,例如,"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是,按串中字符的排列次序顺序存放,每个字符占1字节,并在末…...
《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)
《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1) 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…...
深入解析gdb -p 与gdb attach 的区别与使用场景
摘要:本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点,帮助读者更好地理解并运用这两个调试工具。 一、引言 在Linux系统中,GDB(GNU Debugger)是一款功能强大的调试工具,广泛应用…...
C语言 | Leetcode C语言题解之第542题01矩阵
题目: 题解: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…...
论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution
论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…...
前端介绍|基础入门-html+css+js
文章目录 本课程有什么?前端是什么?1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么? 本套课程是零基础入门保姆级课程,课程主要内容包含: HTML…...
[WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)
1. WSL安装 这里不再赘述,WSL2支持systemd,如果你发现其没有systemd相关指令,那么你应该看看下面这个 https://blog.csdn.net/noneNull0/article/details/135950369 但是,Ubuntu2204用不了这个脚本,比较蛋疼。 – …...
PMC如何根据实际情况调整生产作业计划?
面对原材料价格波动、市场需求突变、供应链不确定性增加等多重挑战,PMC人员如何根据实际情况迅速调整生产作业计划,成为了决定企业能否稳健前行的关键。今天,天行健企业管理咨询公司就来深入探讨,PMC高手们是如何在复杂多变的环境…...
unity中 骨骼、纹理和材质关系
在Unity和游戏开发中,骨骼(Skeleton)、纹理(Texture)和材质(Material)是角色和物体渲染的关键组成部分,它们各自的作用和关系密切关联,通常共同工作来实现一个模型的最终…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
