二级公共基础之数据结构与算法篇(五)树和二叉树

目录

前言

一、树的基本概念

1.父结点和根节点

2.子节点和叶子节点

3.度和深度

4.子树

二、二叉树及其基本性质

1. 二叉树的定义

2. 二叉树的基本性质

性质1

性质2

性质3

性质4

性质5

性质6

三、二叉树的存储结构

四、二叉树的遍历

1.遍历二叉树的概念

1. 前序遍历二叉树

2. 中序遍历二叉树

3. 后序遍历二叉树

4. 层次遍历二叉树

2.常考题目

五、二叉树中常考题目

1.完全二叉树


前言

        这篇博客主要介绍树和二叉树。树是一种常见的数据结构,广泛应用于计算机科学和工程领域,如文件系统、数据库索引、表达式解析等。二叉树是树的一种特殊形式,具有许多独特的性质和应用。

一、树的基本概念

        树(Tree)是一种简单的非线性结构。

        图1.二叉树

1.父结点和根节点

        在树结构中,每一个结点有一个直接前驱,称为父节点。

        没有前驱的节点只有一个,称为树的根节点。

        在图1中,A节点是树的根节点。

2.子节点和叶子节点

        在树结构中,每一个节点可以有多个直接后继,称为子节点。

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

        叶子节点是树的最底层节点。

        在图1中D、H、I、F、G均为叶子节点。

3.度和深度

        在树结构中,节点所拥有的子节点的个数称为该节点的度。

       在图1中节点A和节点E的度为2,节点C的度为1。

        节点的深度是从根节点到该节点的路径长度。

        树的深度是所有节点深度的最大值。

4.子树

        在树结构中,以某节点的一个子节点为根构成的树称为该节点的一棵子树。

二、二叉树及其基本性质

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

1. 二叉树的定义

        二叉树可以为空,也可以由一个根节点和两个互不相交的子树组成,分别称为左子树和右子树。

2. 二叉树的基本性质

性质1

        在二叉树的第k层上最多有$2^{k-1}$个节点(k≥1)。

性质2

        深度为k的二叉树中,最多有$2^{k-1}$个节点。

性质3

        对任意一棵二叉树,度为0的节点(即叶子节点)总比度为2的节点多一个。​

性质4

        具有n个节点的二叉树,其深度至少为[\log_{2} n]+1,其中\log_{2} n表示表达式的整数部分。

性质5

        具有n个节点的完全二叉树的深度为[\log_{2} n]+1

性质6

图2.二叉树的性质6

三、二叉树的存储结构

        二叉树通常采用链式存储结构。用于存储二叉树中数据元素的存储节点由数据域和指针域两部分组成。指针域包括左指针域和右指针域。

四、二叉树的遍历

1.遍历二叉树的概念

        二叉树的遍历是指按照某种顺序访问二叉树中的所有节点。常见的遍历方法有前序遍历、中序遍历和后序遍历。

1. 前序遍历二叉树

        前序遍历二叉树(Pre_order Traversal)是先遍历左子树,然后遍历根节点和右子树。

        访问顺序:根节点 -> 左子树 -> 右子树。

2. 中序遍历二叉树

        前序遍历二叉树(In_order Traversal)是先遍历根节点,然后遍历左子树和右子树。

        访问顺序:左子树 -> 根节点 -> 右子树。

3. 后序遍历二叉树

        前序遍历二叉树(Post_order Traversal)是先遍历左子树,然后遍历根节点和右子树。

        访问顺序:左子树 -> 右子树 -> 根节点。

4. 层次遍历二叉树

        层次遍历二叉树(Level_order Traversal)是按照树的层次从上到下,从左到右依次访问每个节点。用队列实现,先访问根节点。

        访问顺序:左子树 -> 右子树 -> 根节点。

        以下是二叉树的前序、中序和后序遍历的实现:

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点
typedef struct TreeNode {int data;struct TreeNode *left;struct TreeNode *right;
} TreeNode;// 定义队列节点
typedef struct QueueNode {TreeNode *treeNode;struct QueueNode *next;
} QueueNode;// 定义队列
typedef struct Queue {QueueNode *front;QueueNode *rear;
} Queue;// 创建新节点
TreeNode* createNode(int data) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));newNode->data = data;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 创建队列
Queue* createQueue() {Queue* queue = (Queue*)malloc(sizeof(Queue));queue->front = NULL;queue->rear = NULL;return queue;
}// 入队
void enqueue(Queue* queue, TreeNode* treeNode) {QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));newNode->treeNode = treeNode;newNode->next = NULL;if (queue->rear == NULL) {queue->front = newNode;queue->rear = newNode;} else {queue->rear->next = newNode;queue->rear = newNode;}
}// 出队
TreeNode* dequeue(Queue* queue) {if (queue->front == NULL) {return NULL;}QueueNode* temp = queue->front;TreeNode* treeNode = temp->treeNode;queue->front = queue->front->next;if (queue->front == NULL) {queue->rear = NULL;}free(temp);return treeNode;
}// 判断队列是否为空
int isEmpty(Queue* queue) {return queue->front == NULL;
}// 层次遍历
void levelOrderTraversal(TreeNode* root) {if (root == NULL) return;Queue* queue = createQueue();enqueue(queue, root);while (!isEmpty(queue)) {TreeNode* currentNode = dequeue(queue);printf("%d ", currentNode->data);if (currentNode->left != NULL) {enqueue(queue, currentNode->left);}if (currentNode->right != NULL) {enqueue(queue, currentNode->right);}}free(queue);
}// 前序遍历
void preOrderTraversal(TreeNode* root) {if (root == NULL) return;printf("%d ", root->data);preOrderTraversal(root->left);preOrderTraversal(root->right);
}// 中序遍历
void inOrderTraversal(TreeNode* root) {if (root == NULL) return;inOrderTraversal(root->left);printf("%d ", root->data);inOrderTraversal(root->right);
}// 后序遍历
void postOrderTraversal(TreeNode* root) {if (root == NULL) return;postOrderTraversal(root->left);postOrderTraversal(root->right);printf("%d ", root->data);
}// 主函数
int main() {// 创建一个简单的二叉树TreeNode* root = createNode(1);root->left = createNode(2);root->right = createNode(3);root->left->left = createNode(4);root->left->right = createNode(5);printf("前序遍历: ");preOrderTraversal(root);printf("\n");printf("中序遍历: ");inOrderTraversal(root);printf("\n");printf("后序遍历: ");postOrderTraversal(root);printf("\n");printf("层次遍历: ");levelOrderTraversal(root);printf("\n");return 0;
}

2.常考题目

某二叉树的后序遍历序列和中序遍历序列相同,均为A、B、C、D、E、F,则按层次输出(同一层从左到右)的序列为()

A、ABCDEF        B、CBAFED        C、FEDCBA        D、DEFCBA

        答案为C。

五、二叉树中常考题目

1.完全二叉树

1.深度为5的完全二叉树的结点数不可能是()

A、15

B、16

C、17

D、18

       

        我觉得这道题的关键在于理解后序遍历和中序遍历相同的情况。后序遍历是左子树、右子树、根节点,中序遍历是左子树、根节点、右子树。题目说这两个序列相同,都是ABCDEF。

        我先假设树的结构,如果每个节点都只有左子节点,中序遍历会是B, A, D, C, F, E,这和ABCDEF不一样。如果每个节点都只有右子节点,中序遍历会是A, B, C, D, E, F,也不对。完全平衡的树也不行,因为后序遍历会是F, D, E, B, C, A,这也不对。

后来我想到,如果后序遍历和中序遍历相同,根节点F必须在序列的末尾。这表明左子树包含所有节点,除了F。所以树的结构应该是:

   F
   /
  E
 /
D
/
C
/
B
/
A

        这棵树的后序遍历是A, B, C, D, E, F,中序遍历也是A, B, C, D, E, F,符合题意。

        接下来,我需要找出这棵树的层次遍历。从根节点F开始,然后是E,然后是D,然后是C,然后是B,最后是A。所以层次遍历应该是FEDCBA。

        选项C是FEDCBA,这和我得到的结果一致。所以答案是C. FEDCBA。

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

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

相关文章

自制操作系统学习第七天

今天要做什么&#xff1f; 实现HLT&#xff0c;不让计算机处于HALT&#xff08;HLT&#xff09;.用C语言实现内存写入&#xff08;错误&#xff0c;需要分析&#xff09; 一:使用HLT&#xff0c;让计算机处于睡眠状态 写了下面这个程序&#xff0c;naskfunc.nas 函数名叫io_h…

Python Django系列—入门实例(二)

数据库配置 现在&#xff0c;打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下&#xff0c;​ DATABASES 配置使用 SQLite。如果你是数据库新手&#xff0c;或者只是想尝试 Django&#xff0c;这是最简单的选择。SQLite 包含在 Python 中…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…

nginx 反向代理 配置请求路由

nginx | 反向代理 | 配置请求路由 nginx简介 Nginx&#xff08;发音为“Engine-X”&#xff09;是一款高性能、开源的 Web 服务器和反向代理服务器&#xff0c;同时也支持邮件代理和负载均衡等功能。它由俄罗斯程序员伊戈尔西索夫&#xff08;Igor Sysoev&#xff09;于 2004…

ath9k(Atheros芯片)开源驱动之wifi连接

为什么会推荐这个wifi 驱动进行学习&#xff1f; ath9k&#xff08;Atheros芯片&#xff09;&#xff1a;代码结构清晰&#xff0c;适合学习实践 为什么我只在开篇写了一个wifi连接的操作&#xff1f; 先让一个开源驱动在你的硬件上跑起来&#xff0c;再逐步修改&#xff0c…

LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型

上篇文章记录了使用lora微调deepseek-7b&#xff0c;微调成功&#xff0c;但是微调llama3-8b显存爆炸&#xff0c;这次尝试使用qlora微调HQQ方式量化&#xff0c;微调更大参数体量的大语言模型&#xff0c;记录下来微调过程&#xff0c;仅供参考。 对过程不感兴趣的兄弟们可以直…

知识管理平台如何实现高效数据整合?

内容概要 现代知识管理平台通过架构化的四库体系&#xff08;资源库、规则库、模型库、知识库&#xff09;驱动数据智能整合进程。核心机制依托智能数据工具集对异构数据进行自动化清洗与语义标注&#xff0c;其跨源数据汇聚能力支持超过200种结构化与非结构化数据源的接入&am…

近10年气象分析(深度学习)

这是一个气象数据分析程序&#xff0c;主要用于分析和可视化气象数据。以下是该文件的主要功能&#xff1a; 1. 数据加载 在线数据&#xff1a;尝试从 GitHub 加载气象数据。 示例数据&#xff1a;如果无法加载在线数据&#xff0c;程序会自动生成示例数据。 2. 数据分析 …

DeepSeek最新开源动态:核心技术公布

2月21日午间&#xff0c;DeepSeek在社交平台X发文称&#xff0c;从下周开始&#xff0c;他们将开源5个代码库&#xff0c;以完全透明的方式与全球开发者社区分享他们的研究进展。并将这一计划定义为“Open Source Week”。 DeepSeek表示&#xff0c;即将开源的代码库是他们在线…

wps中zotero插件消失,解决每次都需要重新开问题

参考 查看zotero目录 D:\zotero\integration\word-for-windows 加载项点击 dotm即可 长期解决 把dom 复制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN还是每次都需要重新开的话 重新加载一下

洛谷B3629

B3629 吃冰棍 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream>using namespace std; int main(){int n,ans;cin >> n;for(int in/2;i<n;i){int ti;ans0;while(t>3){t-3;ans3;t;}if(anst>n){cout << i;return 0;}}return…

VMware安装Centos 9虚拟机+设置共享文件夹+远程登录

一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境&#xff0c;所以一开始的安装准备工作有&#xff1a; vmware版本&#xff1a;VMware Workstation 16 镜像版本&#xff1a;CentOS-Stream-9-latest-x86_64-dvd1.iso &#xff08;kernel-5.14.0&#xff09; …

[ProtoBuf] 介绍 | 保姆级win/linux安装教程

目录 一、序列化概念 二、ProtoBuf 是什么 三、ProtoBuf 的使用特点 ProtoBuf 在不同操作系统下的安装 一、ProtoBuf 在 Windows 下的安装 二、ProtoBuf 在 Linux 下的安装 三、检查是否安装成功 安装教程 可以直接目录跳转到后面 笔记参考&#xff1a;官方文档 一、序…

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…

51单片机学习之旅——定时器

打开软件 1与其它等于其它&#xff0c;0与其它等于0 1或其它等于1&#xff0c;0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作&#xff0c;高四位保持&#xff0c;低四位清零&#xff0c;高四位定时器1&#xff0c;低四位定时器0 TMODTMOD|0x01;//0x010000 0…

【跟我学YOLO】(1)YOLO12:以注意力为中心的物体检测

欢迎关注『跟我学 YOLO』系列 【跟我学YOLO】&#xff08;1&#xff09;YOLO12&#xff1a;以注意力为中心的物体检测] 0. YOLOv12 简介0.1 YOLO12 论文下载0.2 YOLO12 的主要改进0.3 YOLO12 支持的任务和性能0.4 论文摘要 1. 背景介绍2. 相关的工作3. 方法3.1 效率分析3.2 区域…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用&#xff0c;本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据&#xff1a; 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…