十天学完基础数据结构-第六天(树(Tree))

在这里插入图片描述

树的基本概念

是一种层次性的数据结构,它由节点组成,这些节点按照层次关系相互连接。树具有以下基本概念:

  • 根节点:树的顶部节点,没有父节点。

  • 子节点:树中每个节点可以有零个或多个子节点。

  • 叶节点:没有子节点的节点称为叶节点。

  • 父节点:每个节点都可以有一个父节点,除了根节点。

  • 深度:节点所在的层次称为深度。根节点的深度为0,其子节点深度为1,以此类推。

二叉树和二叉搜索树(BST)的定义

二叉树是一种特殊的树,其中每个节点最多有两个子节点:左子节点和右子节点。

**二叉搜索树(BST)**是一种二叉树,其中每个节点都遵循以下规则:

  • 左子树中的所有节点的值小于当前节点的值。

  • 右子树中的所有节点的值大于当前节点的值。

这种有序性使得二叉搜索树非常适合搜索和排序操作。

树的遍历方法

遍历树意味着按照一定顺序访问树中的节点。树的三种常见遍历方法如下:

  • 前序遍历:首先访问根节点,然后按照左子树、右子树的顺序遍历。

  • 中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树。中序遍历可以用于对BST进行排序。

  • 后序遍历:首先遍历左子树,然后遍历右子树,最后访问根节点。

下面是一个简单的C++示例,创建二叉树和进行中序遍历:

#include <iostream>// 二叉树节点定义
struct TreeNode {int data;           // 节点数据TreeNode* left;     // 左子节点TreeNode* right;    // 右子节点
};// 中序遍历函数
void inOrderTraversal(TreeNode* root) {if (root != nullptr) {inOrderTraversal(root->left);std::cout << root->data << " ";inOrderTraversal(root->right);}
}int main() {// 创建二叉树TreeNode* root = new TreeNode{1, nullptr, nullptr};root->left = new TreeNode{2, nullptr, nullptr};root->right = new TreeNode{3, nullptr, nullptr};// 中序遍历inOrderTraversal(root);return 0;
}

运行结果:
在这里插入图片描述

练习题:

  1. 二叉树和二叉搜索树有何不同?什么情况下你会选择使用二叉搜索树?

  2. 解释中序遍历的概念。为什么中序遍历在二叉搜索树中非常有用?

  3. 描述一种情况,其中树结构比线性数据结构(如数组或链表)更适合存储和组织数据。

  4. 请编写一个C++程序,创建一个简单的二叉树,并执行中序遍历,以输出节点的值。

二叉树和二叉搜索树有何不同?什么情况下你会选择使用二叉搜索树?

  • 不同之处:主要区别在于有序性。二叉树是一种树形结构,每个节点最多有两个子节点。而二叉搜索树(BST)是一种特殊的二叉树,具有有序性。在BST中,左子树中的所有节点的值小于当前节点的值,右子树中的所有节点的值大于当前节点的值。

  • 选择BST的情况:你会选择使用BST的情况包括需要高效的搜索和排序操作时。BST的有序性使得搜索操作非常快速,平均时间复杂度为O(log n),其中n是树中节点的数量。此外,BST还可以用于实现字典、数据库索引等需要快速查找和插入的应用。

解释中序遍历的概念。为什么中序遍历在二叉搜索树中非常有用?

  • 中序遍历是一种树的遍历方式,其基本概念是按照左子树、根节点、右子树的顺序遍历树中的节点。在中序遍历中,首先遍历左子树中的所有节点,然后访问根节点,最后遍历右子树中的所有节点。

  • 中序遍历在BST中的重要性:在BST中,中序遍历可以按照升序顺序访问树中的节点。这意味着通过中序遍历可以得到有序的节点序列。因此,中序遍历在BST中非常有用,可以用于实现对树的排序操作,也可以用于搜索操作,因为在有序序列中可以快速找到目标值。

描述一种情况,其中树结构比线性数据结构(如数组或链表)更适合存储和组织数据。

  • 情况示例:组织文件系统。文件系统通常采用树形结构来组织文件和文件夹。每个文件夹可以包含文件和其他文件夹,这形成了一个树状结构,其中根节点代表顶级目录,叶节点代表文件。这种树形结构使得文件系统可以轻松实现文件的组织、搜索和访问。

注意:树结构在这种情况下更适合,因为它能够清晰地表示文件之间的层次关系和组织结构,而线性数据结构(如数组)通常不足以表示这种复杂性。

请编写一个C++程序,创建一个简单的二叉树,并执行中序遍历,以输出节点的值。

创建一个二叉树并进行中序遍历:

#include <iostream>// 二叉树节点定义
struct TreeNode {int data;           // 节点数据TreeNode* left;     // 左子节点TreeNode* right;    // 右子节点
};// 中序遍历函数
void inOrderTraversal(TreeNode* root) {if (root != nullptr) {inOrderTraversal(root->left);std::cout << root->data << " ";inOrderTraversal(root->right);}
}int main() {// 创建二叉树TreeNode* root = new TreeNode{4, nullptr, nullptr};root->left = new TreeNode{2, nullptr, nullptr};root->right = new TreeNode{6, nullptr, nullptr};root->left->left = new TreeNode{1, nullptr, nullptr};root->left->right = new TreeNode{3, nullptr, nullptr};root->right->left = new TreeNode{5, nullptr, nullptr};root->right->right = new TreeNode{7, nullptr, nullptr};// 中序遍历inOrderTraversal(root);return 0;
}

运行结果:在这里插入图片描述

这个程序创建了一个简单的二叉树,并使用中序遍历打印节点的值。

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

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

相关文章

Linux查看防火墙状态

1.CentOS查看防火墙 firewall-cmd --state 显示状态 2.Ubuntu查看防火墙 sudo ufw status

js判断数据类型、toString和valueOf区别,类型转换、不同类型间的运算、判断相等

目录 判断数据类型 运算符 typeof&#xff1a;判断 基本数据类型 typeof nullObject 类型标签均为000 实例 instanceof 构造函数&#xff1a;判断原型链&#xff0c;和isPrototypeOf 方法 构造函数.prototype.isPrototypeOf(实例) &#xff1a;判断原型链 (数据).const…

zookeeper选举机制

全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊&#xff0c;仔细思考了一下&#xff0c;应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关&#xff0c;下面以3个举例 选举过程如下 server…

基于SpringBoot的高考志愿填报系统

功能需求&#xff1a; 1.用户可以根据自己的院校类型、办学类型、层次类型、地域等因素筛选高校。 2.用户可以查询到所选高校的基本信息&#xff0c;包括学校的概况、历史沿革、办学特色、学院设置、师资力量、科研实力等。 3.用户可以查询到所选高校的高校开设专业&#xff0c…

模块化编程+LCD1602调试工具——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;刚刚学完静态数码管显示和动态数码管显示&#xff0c;感觉真不错呢&#xff0c;下面&#xff0c;小雅兰就要开始学习模块化编程以及LCD1602调试工具的知识了&#xff0c;让我们进入51单片机的世界吧&#xff01;&am…

AMD GPU 内核驱动分析(三)-dma-fence 同步工作模型

在Linux Kernel 的AMDGPU驱动实现中&#xff0c;dma-fence扮演着重要角色&#xff0c;AMDGPU的Render/解码操作可能涉及到多个方面同时引用buffer的情况&#xff0c;以渲染/视频解码场景为例&#xff0c;应用将渲染/解码命令写入和GPU共享的BUFFER之后&#xff0c;需要将任务提…

<C++> 智能指针

智能指针的使用 内存泄露问题 内存泄露是指因为疏忽或错误&#xff0c;造成程序未能释放已经不再使用的内存的情况。比如&#xff1a; #include <iostream> #include <stdexcept> using namespace std; int div() {int a, b;cin >> a >> b;if (b 0…

关于PointHeadBox类的理解

forward函数 def forward(self, batch_dict):"""Args:batch_dict:batch_size:point_features: (N1 N2 N3 ..., C) or (B, N, C)point_features_before_fusion: (N1 N2 N3 ..., C)point_coords: (N1 N2 N3 ..., 4) [bs_idx, x, y, z]point_labels (opti…

【算法】排序——归并排序和计数排序

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…

在Ubuntu 20.04搭建最小实验环境

sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates安装导入GPG公钥所需的依赖包。 sudo wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -导入GPG密钥。 sudo apt-get -y install --no-install-recommends software-p…

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…

【VUE·疑难问题】定义 table 中每行的高度(使用 element-UI)

一、如何定义 table 中每一行的 height &#xff1f; 1.table例子 <!-- 二、table --><div style"overflow: hidden;display: block;height: 68vh;width: 100%;"><el-table stripe show-header style"width: 100%" :data"tableData&q…

密码技术 (6) - 证书

一. 前言 前面介绍的公钥密码和数字签名&#xff0c;都无法解决一个问题&#xff0c;那就是判断自己获取的公钥是否期望的&#xff0c;不能确定公钥是否被中间攻击人掉包。所以&#xff0c;证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。 二…

macbook电脑磁盘满了怎么删东西?

macbook是苹果公司的一款高性能笔记本电脑&#xff0c;受到很多用户的喜爱。但是&#xff0c;如果macbook的磁盘空间不足&#xff0c;可能会导致一些问题&#xff0c;比如无法开机、运行缓慢、应用崩溃等。那么&#xff0c;macbook磁盘满了无法开机怎么办&#xff0c;macbook磁…

大数据-玩转数据-Flink SQL编程实战 (热门商品TOP N)

一、需求描述 每隔30min 统计最近 1hour的热门商品 top3, 并把统计的结果写入到mysql中。 二、需求分析 1.统计每个商品的点击量, 开窗2.分组窗口分组3.over窗口 三、需求实现 3.1、创建数据源示例 input/UserBehavior.csv 543462,1715,1464116,pv,1511658000 662867,22…

新版校园跑腿独立版小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务

最新校园跑腿小程序源码 多校版本&#xff0c;多模块&#xff0c;适合跑腿&#xff0c;外卖&#xff0c;表白&#xff0c;二手&#xff0c;快递等校园服务 此版本为独立版本&#xff0c;不需要** 直接放入就可以 需要自己准备好后台的服务器&#xff0c;已认证的小程序&#xf…

网络基础入门(网络基础概念详解)

本篇文章主要是对网络初学的概念进行解释&#xff0c;可以让你对网络有一个大概整体的认知。 文章目录 一、简单认识网络 1、1 什么是网络 1、2 网络分类 二、网络模型 2、1OSI七层模型 2、1、1 简单认识协议 2、1、2 OSI七层模型解释 2、2 TCP/IP五层(或四层)模型 三、网络传…

26-网络通信

网络通信 什么是网络编程&#xff1f; 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 java.net.包下提供了网络编程的解决方案&#xff01; 基本的通信架构有2种形式&#xff1a;CS架构&#xff08; Client客户端/Server服…

深度学习:基于长短时记忆网络LSTM实现情感分析

目录 1 LSTM网络介绍 1.1 LSTM概述 1.2 LSTM网络结构 1.3 LSTM门机制 1.4 双向LSTM 2 Pytorch LSTM输入输出 2.1 LSTM参数 2.2 LSTM输入 2.3 LSTM输出 2.4 隐藏层状态初始化 3 基于LSTM实现情感分析 3.1 情感分析介绍 3.2 数据集介绍 3.3 基于pytorch的代码实现 3…

Ventoy万能U盘安装系统,支持任何的操作系统安装

Ventoy万能U盘安装系统&#xff0c;支持任何的操作系统安装&#xff1a; Download . VentoyVentoy is an open source tool to create bootable USB drive for ISO files. With ventoy, you dont need to format the disk again and again, you just need to copy the iso fil…