【408考点之数据结构】二叉树的遍历及线索二叉树

二叉树的遍历及线索二叉树

一、二叉树的遍历

二叉树的遍历是指按照一定的顺序访问二叉树中所有节点。常见的遍历方法有前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)、后序遍历(Postorder Traversal)和层次遍历(Level Order Traversal)。

  1. 前序遍历(Preorder Traversal)

    • 过程:访问根节点 -> 前序遍历左子树 -> 前序遍历右子树
    • 代码实现
    void preorderTraversal(TreeNode *root) {if (root) {printf("%d ", root->data);preorderTraversal(root->left);preorderTraversal(root->right);}
    }
    
  2. 中序遍历(Inorder Traversal)

    • 过程:中序遍历左子树 -> 访问根节点 -> 中序遍历右子树
    • 代码实现
    void inorderTraversal(TreeNode *root) {if (root) {inorderTraversal(root->left);printf("%d ", root->data);inorderTraversal(root->right);}
    }
    
  3. 后序遍历(Postorder Traversal)

    • 过程:后序遍历左子树 -> 后序遍历右子树 -> 访问根节点
    • 代码实现
    void postorderTraversal(TreeNode *root) {if (root) {postorderTraversal(root->left);postorderTraversal(root->right);printf("%d ", root->data);}
    }
    
  4. 层次遍历(Level Order Traversal)

    • 过程:按照层次从上到下、从左到右依次访问各节点
    • 代码实现
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_QUEUE_SIZE 100typedef struct TreeNode {int data;struct TreeNode *left;struct TreeNode *right;
    } TreeNode;typedef struct {TreeNode *data[MAX_QUEUE_SIZE];int front;int rear;
    } Queue;void initQueue(Queue *q) {q->front = q->rear = 0;
    }int isQueueEmpty(Queue *q) {return q->front == q->rear;
    }void enqueue(Queue *q, TreeNode *node) {if ((q->rear + 1) % MAX_QUEUE_SIZE == q->front) {printf("Queue is full\n");return;}q->data[q->rear] = node;q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
    }TreeNode* dequeue(Queue *q) {if (isQueueEmpty(q)) {printf("Queue is empty\n");return NULL;}TreeNode *node = q->data[q->front];q->front = (q->front + 1) % MAX_QUEUE_SIZE;return node;
    }void levelOrderTraversal(TreeNode *root) {if (!root) return;Queue q;initQueue(&q);enqueue(&q, root);while (!isQueueEmpty(&q)) {TreeNode *node = dequeue(&q);printf("%d ", node->data);if (node->left) enqueue(&q, node->left);if (node->right) enqueue(&q, node->right);}
    }
    
二、线索二叉树

线索二叉树是一种特殊的二叉树,通过对空指针加以利用,使得二叉树的遍历更加高效。在线索二叉树中,每个节点的空指针指向在某种遍历方式下的前驱或后继节点。

  1. 线索的定义

    • 前驱(Predecessor):在某种遍历方式下,当前节点的前一个节点。
    • 后继(Successor):在某种遍历方式下,当前节点的后一个节点。
  2. 线索二叉树的类型

    • 前序线索二叉树(Preorder Threaded Binary Tree):前序遍历下的前驱和后继。
    • 中序线索二叉树(Inorder Threaded Binary Tree):中序遍历下的前驱和后继。
    • 后序线索二叉树(Postorder Threaded Binary Tree):后序遍历下的前驱和后继。
  3. 线索二叉树的结构定义

    typedef struct ThreadedTreeNode {int data;struct ThreadedTreeNode *left;struct ThreadedTreeNode *right;int ltag; // 0: left指向左孩子, 1: left指向前驱int rtag; // 0: right指向右孩子, 1: right指向后继
    } ThreadedTreeNode;
    
  4. 中序线索二叉树的建立

    void createInorderThread(ThreadedTreeNode *root, ThreadedTreeNode **pre) {if (root) {createInorderThread(root->left, pre);if (!root->left) {root->left = *pre;root->ltag = 1;}if (*pre && !(*pre)->right) {(*pre)->right = root;(*pre)->rtag = 1;}*pre = root;createInorderThread(root->right, pre);}
    }void createInorderThreadTree(ThreadedTreeNode *root) {ThreadedTreeNode *pre = NULL;if (root) {createInorderThread(root, &pre);if (pre->right == NULL) {pre->rtag = 1;}}
    }
    
  5. 中序线索二叉树的遍历

    void inorderThreadedTraversal(ThreadedTreeNode *root) {ThreadedTreeNode *p = root;while (p) {while (p->ltag == 0) {p = p->left;}printf("%d ", p->data);while (p->rtag == 1 && p->right != NULL) {p = p->right;printf("%d ", p->data);}p = p->right;}
    }
    

使用场景

  1. 表达式树的构建和求值:通过中序遍历和后序遍历,可以有效地对表达式进行解析和求值。
  2. 数据库查询优化:使用线索二叉树可以加快查询速度,减少查询时间。
  3. 文件系统管理:层次遍历用于文件系统目录的遍历,便于管理和查找文件。
  4. 数据压缩与编码:霍夫曼树利用二叉树结构实现高效的编码和解码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浮点数原理与`BigDecimal`实践应用

浮点数原理与BigDecimal实践应用 问题引入&#xff1a; 浮点数 浮点数如何表示数字&#xff1f; 浮点数采用科学计数法表示一个数字&#xff0c;具体格式为&#xff1a; V ( − 1 ) S ∗ M ∗ R E V (-1)^S * M * R^E V(−1)S∗M∗RE S&#xff1a;符号位&#xff0c;取…

什么是 HTTP Range请求(范围请求)

HTTP Range&#xff1a;范围请求 Range 头是在 HTTP/1.1 协议中新增的一个请求头。包含 Range 头的请求通常称为范围请求&#xff0c;因为 Range 头允许服务器只发送部分响应到客户端&#xff0c;它是下载工具&#xff08;例如迅雷&#xff09;实现多线程下载的核心所在&#…

vue3+crypto-js插件实现对密码加密后传给后端

最近在做项目的过程中又遇到了一个新的问题&#xff0c;在实现后端管理系统的个人信息页面中&#xff0c;涉及到修改密码的功能&#xff0c;刚开始我直接通过传参的方式将修改的密码传入给后端&#xff0c;可是后端说需要将原密码、新密码以及确认密码都进行加密处理&#xff0…

大模型技术的应用场景

大模型技术&#xff08;Large Language Model&#xff0c;LLM&#xff09;是指具有大量参数和训练数据的神经网络模型&#xff0c;它能够学习语言的统计规律&#xff0c;并生成与人类书写的文本相似的文本。大模型技术在近年来取得了重大进展&#xff0c;并开始在各种领域得到应…

OpenAI 推迟了 ChatGPT 的新语音模式

今年 5 月&#xff0c;OpenAI 首次为其人工智能聊天机器人平台ChatGPT演示了一种非常逼真、近乎实时的"高级语音模式"。几个月后&#xff0c;OpenAI 表示需要更多时间。 OpenAI 在其官方 Discord 服务器上发布了一篇文章&#xff0c;称其原计划于 6 月底开始向一小部…

04 Shell编程之正则表达式与文本处理器

1、正则表达式 1.1 正则表达式的定义 正则表达式又称为正规表达式、常规表达式。 正则表达式是使用单个字符来描述、匹配一系列符合某个句法规则的字符串&#xff0c; 简单来说&#xff0c;正则表达式就是一种匹配字符串的方法&#xff08;通过一些特殊符号&#xff0c;实现…

搜狗微信文章数据爬取可视化

搜狗微信文章数据爬取可视化 一、爬取流程1.1 寻找数据接口1.2 发送请求获取数据1.3 xpath表达式解析数据1.4 保存数据二、数据可视化三、完整代码一、爬取流程 搜狗微信的主页:https://weixin.sogou.com/,主页截图如下,在搜索框中输入要查询的内容,以“百合花”为例: 观…

学习记录698@基带传输和频带传输基础

还是在学习计算机网络物理层时遇到这些知识点&#xff0c;这里简单的记录一下&#xff0c;主要都是通信专业的知识 基带传输 信源发出的原始信号叫做基带信号&#xff0c;基带信号分为模拟基带信号与数字基带信号。基带信号一般是低频成分&#xff0c;适合在具有低通特性的有…

203.回溯算法:N皇后(力扣)

class Solution { public:vector<vector<string>> result; // 用于存储所有合法的 N 皇后放置方案// 判断当前位置 (row, col) 是否可以放置皇后bool isValid(int row, int col, vector<string>& chess, int n) {// 检查当前列是否有皇后for (int i 0;…

学好 prompt 让大模型变身撩富婆专家,带你走上人生巅峰

前文 使用大模型的最重要的一步就是编写好的提示词 prompt &#xff0c;但是 prompt 既容易被低估也容易被高估。被低估是因为设计良好的提示词可以显著提升效果。被高估是因为即使是基于提示的应用也需要大量的工程工作才能使其发挥作用。下面我会介绍在编写 prompt 的时候&a…

【面试干货】Java中new与clone操作对象的比较

【面试干货】Java中new与clone操作对象的比较 1、new操作符创建对象的过程2、clone方法创建对象的过程3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、new操作符创建对象的过程 new操作符在Java中用于创建对象&#xff0c;并执行…

一年Java|16K|同程艺龙面经

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 背景 公司&#xff1a;同程艺龙成都BU,现场部门老大面 之前的同程艺龙电话一面过了&#xff0c;然后通知到同程艺龙成都办公地点现场进行部门老大…

深入探讨计算机网络中的各种报文

在计算机网络中&#xff0c;报文&#xff08;Packet&#xff09;是数据传输的基本单位。不同的协议使用不同类型的报文来实现数据传输的各种功能。本文将详细探讨计算机网络中常见的几种报文类型&#xff0c;并通过举例说明其具体应用。 一、TCP/IP协议栈中的报文 TCP/IP协议…

C语言实战 | “贪吃蛇”游戏重构

程序设计的过程中,面对复杂项目,利用模块化思维分解任务,是关键的一步。读者一定要掌握模块化思维设计思维,为将来团队合作、协同完成大型应用软件做好准备。 01、“贪吃蛇”游戏 有了游戏框架之后,按照游戏框架完成“贪吃蛇”游戏。 “贪吃蛇”游戏角色有两个:“贪吃蛇…

设计总监独家揭秘:后台管理系统设计全攻略!

后台管理是反映用户行为、提高产品保留率的有力依据。设计师将后台管理的各种数据创建成清晰、合乎逻辑、可操作的后台管理仪表板。当您设计一个美观实用的UI后台管理时&#xff0c;它会给用户带来更直观的信息内容&#xff0c;从而提高用户体验。因此&#xff0c;后台管理设计…

Java基础入门day70

day70 Mybatis mybatis实现多表的关联 关于数据库的设计 当前有五张表&#xff0c;用户表&#xff0c;订单表&#xff0c;订单详情表&#xff0c;商品表&#xff0c;商品类型表 订单表 Orders订单表oidvarchar(32)主键订单编号uidint用户编号paytypevarchar(20)非空&#xff…

用C语言声明汇编编写的函数,是否需要带参数列表?

1.被声明的汇编函数本身有参数输入 例如&#xff0c;有如下汇编函数&#xff1a; section .text global add add: ; 假设 a 在 [ebp8]&#xff0c;b 在 [ebp12]&#xff08;这是基于 C 调用约定的典型栈布局&#xff09; mov eax, [ebp8] ; 将 a 的值加载到 eax 寄存器 add e…

git 查看本地和远程分支

要查看 Git 仓库中的所有分支&#xff0c;可以使用以下命令&#xff1a; git branch执行该命令后&#xff0c;Git 会列出当前仓库中的所有分支&#xff0c;并在当前所在的分支前加上一个 * 标记。 如果你想查看远程仓库的分支&#xff0c;可以添加 -r 或 --remotes 选项&…

Java中不同I/O操作的性能比较

Java中不同I/O操作的性能比较 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;对于I/O操作的选择不仅影响到代码的简洁性和可读性&am…

详解LLM大模型是如何理解并使用 tools ?

前文 大家肯定对使用大模型的函数回调或者说 Tools 已经耳熟能详了&#xff0c;那么他们具体内部是如何运作的呢&#xff0c;本文就此事会详细给大家介绍具体的细节。 tools 首先是大家最熟悉的环节&#xff0c;定义两个 tool 的具体实现&#xff0c;其实就是两个函数&#…