首页 > 其他分享 >10.24

10.24

时间:2024-10-24 23:21:14浏览次数:6  
标签:10.24 指向 中序 线索 二叉树 root 节点

今天学了数据结构中的线索二叉树-
线索:在传统的二叉树中,节点的左指针指向左子树,右指针指向右子树。如果节点没有左子树,则左指针指向该节点的中序前驱节点;如果没有右子树,则右指针指向中序后继节点。

线索二叉树的性质:线索二叉树通过这种方式使得遍历时不再需要使用栈或递归,能够直接按照前序、中序或后序进行非递归遍历。
2.线索二叉树的种类- 前序线索二叉树:在前序线索二叉树中,节点的左线索指向前驱节点,右线索指向后继节点。

中序线索二叉树:在中序线索二叉树中,左线索指向中序前驱,右线索指向中序后继。
后序线索二叉树:相对少用,节点的右线索指向后继,左线索指向前驱。
3.线索二叉树的构建- 创建线索二叉树的过程:需要遍历一棵普通的二叉树,在遍历过程中,通过保存前一个访问的节点来构造线索。在访问当前节点时,更新前驱和后继信息。
4.线索二叉树的遍历- 中序遍历:通过线索化的结构,可以实现中序遍历而无需使用栈或递归,从而提升遍历效率。
前序和后序遍历:线索二叉树也支持前序和后序遍历,但实现会更加复杂。
5. 应用场景- 避免栈空间:在进行树的遍历时,可以避免使用系统栈,因此适合于大规模树的遍历。
内存管理:通过线索化降低了对内存的需求,做到了树结构的优化。
6.线索化的标识- 通常会引入一个字段来标识指针是指向子节点还是线索。常见的做法是在节点结构中增加一个布尔值(如isThread,或isLeftThread和isRightThread)。
7.线索二叉树的缺点- 复杂性:相比普通的二叉树,为其添加线索会增加实现的复杂性。
不适合某些操作:某些情况下,线索化可能反而使得树的某些基本操作变得复杂。
8. 示例代码(中序线索二叉树的构建)
以下是一个简单的中序线索二叉树的节点结构和线索化的代码示例:

c#include

include <stdlib.h>

typedef struct ThreadNode {
int data; // 节点数据 struct ThreadNode* lchild; // 左孩子 struct ThreadNode* rchild; //右孩子 int ltag; // 左标记:0表示指向左孩子,1表示指向前驱 int rtag; //右标记:0表示指向右孩子,1表示指向后继} ThreadNode;

ThreadNode* pre = NULL; // 用于存储前一个访问的节点void createThreadTree(ThreadNode* root) {
if (root == NULL) return;
createThreadTree(root->lchild);
if (root->lchild == NULL) { // 如果没有左子树 root->ltag =1; // 设置左标记为线索 root->lchild = pre; // 左指针指向前驱 }
if (pre != NULL && pre->rchild == NULL) { //处理前驱 pre->rtag =1; // 设置右标记为线索 pre->rchild = root; //右指针指向当前节点 }
pre = root; // 更新前驱节点 createThreadTree(root->rchild);
}

// 中序遍历void inThreadTraversal(ThreadNode* root) {
ThreadNode* p = root;
while (p != NULL) {
// 找到最左边的节点 while (p->ltag ==0) {
p = p->lchild;
}
printf("%d ", p->data); //访问节点 // 如果有后继 while (p->rtag ==1 && p->rchild != NULL) {
p = p->rchild;
printf("%d ", p->data);
}
p = p->rchild; // 指向下一个节点 }
}

标签:10.24,指向,中序,线索,二叉树,root,节点
From: https://www.cnblogs.com/lala-la/p/18501558

相关文章

  • 10.24日
    处理客户端请求:Servlet能够接收来自客户端(通常是HTTP请求)并对其进行处理。通过doGet()或doPost()方法,Servlet可以处理不同类型的请求。生成响应:Servlet可以生成动态响应,例如生成HTML、JSON、XML等,返回给客户端。连接后台逻辑:它可以与数据库或其他服务进行交互,以获取......
  • 10.24每日总结:程序员修炼之道读后感1
    首次读《程序员修炼之道:从小工到专家》,我深受启发。这本书犹如一盏明灯,为程序员的成长之路指明了方向。在书中,作者强调了许多重要的理念和实践方法。其中,对我触动最深的是关于代码质量的重视。优秀的程序员不仅要追求代码的功能性,更要注重代码的可读性、可维护性和可扩展性。正如......
  • 10.24
    1. (单选题)以下关于代码重构错误的是()A.可以增加软件的功能。B.可以提高代码可读性。C.代码重构的过程是不改变软件外部行为的前提下优化代码的内部结构。D.改变代码的内部设计。A2. (单选题)测试驱动开发的目的是()A.家中软件测试比重B.只编写使测试通过的功能......
  • 拉普拉斯变换10.24
    目录1.拉普拉斯变换2.拉普拉斯收敛域3.导数的拉普拉斯变换推导过程5.传递函数6.电感电阻电路动态方程拉氏变换常数输入L逆变换7.控制系统传递函数8.非零初始状态的传递函数1.拉普拉斯变换\[\mathscr{L}[f(t)]=F(s)=\int^\infty_0f(t)e^{-st}dt\]$s=\sigma+j\ome......
  • 24.10.24
    A大家使用了整体二分+可撤销并查集,倍增等方法...考虑线段树合并。在跑Kruskal时,如果一个询问的两个点在同一个连通块内,那么这个询问就是可回答的,但是可回答不一定要回答,因为如果此后加的边权相同那么其实里面的点还能再往外走。所以在加边时如果新加的边权大于连通块边权,那......
  • 10.24Python_pandas_基础
    一、基础1、概述Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基础上构建而来Pandas名字衍生自术语“paneldata”(面板数据)和“Pythondataanalysis”(Python数据分析)Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以......
  • 10.24
    考前挂分是个好迹象,至少不像啥也不会那么绝望是不是/A.城市间交通第一眼整体二分+可撤销并查集,觉得有点难写,而且两个\(\log\)。再看一眼,发现最小生成树+倍增优秀单\(\log\)做法。B.最小公倍数第一眼这不是我们P3911最小公倍数之和吗?坏消息是忘了怎么莫反了。于是写了......
  • 2024.10.24 1234版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 10.24
    实验3:工厂方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。[实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgo......
  • 10.24
    一.填空题(共3题,60分)(填空题)支持向量到超平面的距离之和称之为。我的答案:(1)间隔(填空题)支持向量机的核心思想是(最大化/最小化)间隔。我的答案:(1)最大化(填空题)函数可以作为核函数。我的答案:(1)满足Mercer定理条件......