二叉树拙见
1.树的概念及结构
1.1树的概念:
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
(1)有一个特殊的结点,称为根结点,根结点没有前驱结点
(2)除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。
(3)每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。
树的结构:

在树形结构中,子树之间是不能有交集的
1.2树的各部分名称:

结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为3
叶结点或终端结点:度为0的结点称为叶结点; 如上图:E、F、C、G结点为叶结点
非终端结点或分支结点:度不为0的结点; 如上图:A、B、D结点为分支结点
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点;一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为3
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推
树的高度或深度:树中结点的最大层次; 如上图:树的高度为3
堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:E、G互为兄弟结点
结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林
1.3 树的表示
树结构相对线性表就比较复杂,要存储表示起来就比较麻烦,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。
我们用孩子兄弟法进行存储:
typedef int DataType;
struct Node
{struct Node* Child; // 第一个孩子结点struct Node* Brother; // 指向其下一个兄弟结点DataType data; // 结点中的值
};

2.二叉树的概念及结构
2.1二叉树的概念:
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

(1)二叉树不存在度大于2的结点
(2)二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
2.2特殊的二叉树:
(1)满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
(2)完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

2.3二叉树的性质:
(1)在二叉树的第i层上至多有2^i-1个结点(i>=1)下面以满二叉树为例:
第一层的结点是根结点,只有一个,所以2^1-1 = 2^0=1
第二层有两个结点,所以2^(2-1) = 2^1=2
第三层有四个结点,所以2^(3-1) = 2^2=4
第四层有八个结点,所以2^(4-1) = 2^3=8
(2)深度为k的二叉树至多有2^(k-1)个结点(k>=1)
(3)对于任何一颗二叉树,如果其度为0结点数为m,度为2的结点数为n,则m=n+1
(4)具有n个节点的完全二叉树深为(以2为底(n+1)的对数)
(5)如果对一颗有n个结点的完全二叉树的结点按层序编号,对任一结点i(1<=i<=n)
若i>0,i位置结点的双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
2.4二叉树的存储:
(1)顺序存储:
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

(2)链式存储:
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。

3.二叉树的顺序存储实现
3.1顺序结构:
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
3.2堆的概念及结构:
如果有一个关键码的集合K = { k0,k1 ,k2 ,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。
堆的性质:
(1)堆中某个结点的值总是不大于或不小于其父结点的值
(2)堆总是一棵完全二叉树

3.3堆的实现:(向下调整法):
void AdjustHeapDown(type*arr,int n,int parent)
{int child = 2 * parent + 1;//找最小的那一个while (child < n){if (child + 1 < n && arr[child] > arr[child + 1]){child++;}if (arr[child] < arr[parent]){Sweap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}}
}
把最大的数调整到最下面,从而实现小堆的形式
3.4创建堆:
给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过向上调整法,把它构建成一个堆。根结点左右子树不是堆,这里我们从倒数的第一个非叶子结点的子树开始调整,一直调整到根结点的树,就可以调整成堆。

向上调整法代码实现:
void AdjustHeapUp(type* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){if (arr[parent] > arr[child]){Sweap(&arr[parent], &arr[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
3.5堆的实现复杂度:

3.6堆的插入:
可以先插入到最后一个位置,再用向上调整法进行对堆的整理

3.7堆的删除:
可以先把堆顶数据与最后一个数据交换,删除最后一个数据,再用向下调整法整理

4.堆的应用(堆排)
堆排实现可以先建立大堆,把最大的数放到堆顶,再把堆顶数据和最后一个数据交换,在进行向下调整,重复上述操作。
void HeapSort(int* a, int n)
{for (int i = 1; i < n; i++){AdjustHeapUp(a, i);}int k = n - 1;while (k > 0){Sweap(&a[0], &a[k]);AdjustHeapDown(a, k, 0);k--;}
}

5.二叉树的遍历
5.1前序中序后序:
(1)前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
(2)中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
(3)后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
以前序遍历为例:

代码实现:
void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL){printf("N ");return;}printf("%c ", root->data);BinaryTreePrevOrder(root->left);BinaryTreePrevOrder(root->right);
}
中序后序相应把printf的位置放在两个递归中间,递归之后。
5.2层序遍历:
层序遍历:设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

代码实现:
void BinaryTreeLevelOrder(BTNode* root,Queue* q)
{ArrayInit(q);if (root != NULL)ArrayPush(q, root);while (!ArrayEmpty(q)){BTNode* ret = ArrayFirst(q);ArrayPop(q);printf("%c ", ret->data);if (ret->left != NULL)ArrayPush(q, ret->left);if (ret->right != NULL)ArrayPush(q, ret->right);}
}相关文章:
二叉树拙见
1.树的概念及结构 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 ࿰…...
APT 组织 Kimsuky 瞄准大学研究人员
执行摘要 Kimsuky 是一个朝鲜 APT 组织,其任务是执行符合朝鲜政府利益的全球情报收集行动。该组织自 2012 年以来一直活跃,对韩国智库和政府实体特别感兴趣;然而,它也针对美国、英国和其他欧洲国家。Kimsuky 擅长进行有针对性的网…...
Golang | Leetcode Golang题解之第327题区间和的个数
题目: 题解: import "math/rand" // 默认导入的 rand 不是这个库,需要显式指明type node struct {ch [2]*nodepriority intkey intdupCnt intsz int }func (o *node) cmp(b int) int {switch {case b < o.k…...
Django5实战
一、安装: 1、安装Django环境: # 安装 pip install django5.0.3# 验证 5.0.3 python -m django --version 安装慢的解决方法:使用阿里云的镜像源 pip install -i https://mirrors.aliyun.com/pypi/simple django5.0.3 2、创建项目&#…...
网址管理功能 Webstack
前言 在工作生活中大家可能会收集各种网址地址,大部分同学都是通过浏览器标签进行管理。如果你换电脑或者电脑不再身边的时候就有些不方便了。接下来我要向大家推荐一个工具:在线网址导航。 CNS学术导航 大家通过搜索引擎可以很方便的搜索到各种网址导航…...
【热工与工程流体力学】第1章 流体及其主要物理性质,流体的粘性,压缩性,流体的质量力和表面力(西北工业大学)
第1章 流体及其主要物理性质 一、流体力学概述 二、流体力学发展简史 三、本课程的教学计划 四、连续介质模型 五、流体的主要物理性质 六、作用在流体上的力 七、本课程中使用的单位制 一、流体力学概述 1.流体的概念 在任何微小剪应力持续作用下连续变形的物质称为流…...
TCP和UDP区别,各自的应用场景
区别 是否基于链接 TCP是面向连接的协议,发送数据之前需要建立连接;而UDP是无连接的协议,即发送数据之前不需要简历连接。 可靠性和有序性区别 TCP提供交付保证,(TCP通过校验和重传控制,序号表示ÿ…...
Java开发工具IDEA
IDEA概述 Intellij IDEA IDEA全称Intellij IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 IDEA下载和安…...
VIVADO IP核之DDS直接数字频率合成器使用详解
VIVADO IP核之DDS直接数字频率合成器使用详解 目录 前言 一、DDS基本知识 二、DDS IP核使用之SIN COS LUT only 三、DDS IP核之SIN COS LUT only仿真 四、DDS IP核使用之Phase Generator and SIN COS LUT 五、DDS IP核之Phase Generator and SIN COS LUT仿真 总结 前言 …...
Vue3 插槽 使用笔记
Vue3 插槽 使用笔记 介绍 在 Vue 3 中,插槽(Slot)是一个非常强大的特性,它允许我们更好地组织和重用组件。通过定义插槽,子组件可以预留出由父组件控制的区域,这样父组件就可以向这些区域填充自己的内容。…...
Vue2与Vue3响应式原理对比
Vue2.x 响应式原理 Vue2.x 响应式: 实现原理 对象类型:通过 Object.defineProperty() 对属性的读取、修改进行拦截( 数据劫持 )数组类型:通过重写数组方法,并作为拦截器挂载到数组对象与数组原型之间,来实现拦截。 存在…...
Android系统Android.bp文件详解
文章目录 1. 基本语法结构2. 常见模块类型3. 模块属性常见属性包括: 4. 具体示例5. 高级功能5.1. 条件编译5.2. 变量定义与使用5.3. 模块继承 6. 总结 Android.bp 是 Android 构建系统(Android Build System)中的配置文件,用于描述…...
eNSP 华为静态路由配置
R1: <Huawei>system-view [Huawei]sysname R1 [R1]int g0/0/0 //进入g0/0/0端口 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 //给端口配置IP地址和子网掩码 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip addr…...
Type-C PD芯片:引领智能充电与数据传输的新时代
随着科技的飞速发展,智能设备已经成为我们日常生活中不可或缺的一部分。无论是智能手机、平板电脑、笔记本电脑,还是智能家居设备,都需要高效、安全、便捷的充电与数据传输解决方案。在这样的背景下,Type-C PD(Power D…...
天气查询 免费
免费的前提是需要有高德地图key 前去申请一个key 调用IP查询 | 高德控制台 ------ 申请key之后调用下面的接口或者查看官方文档 api地址: restapi.amap.com/v3/weather/weatherInfo 天气查询-基础 API 文档-开发指南-Web服务 API | 高德地图API 参数名 含义 规…...
VC 与 VS(visual studio) 的对应版本
VC 与 VS 对应版本的关系: VC9:对应的是 Visual Studio 2008 版本。在这个版本中,开发环境提供了一系列的新特性和改进,为开发者提供了更高效的编程体验。例如,增强了对 C 标准的支持,优化了调试工具等。 …...
Qt使用lupdate工具生成.ts文件
Qt提供了lupdate工具,用于从源代码中提取需要翻译的字符串【1】,并生成或更新.ts文件 注解【1】:使用tr()函数(或者QCoreApplication::translate()等其他相关的翻译函数)来标记所有需要翻译的文本。例如: …...
编程-设计模式 1:工厂方法模式
设计模式 1:工厂方法模式 定义与目的 定义:工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。目的:提供一种方式来封装对象创建的过程,使得客户端不需要…...
Linux 快速构建LAMP环境
目录 部署方式: 基础环境准备: 1.安装Apache服务 (1)安装Apache (2)安装一些Apache的扩展包 2.安装PHP语言 (1)下载php软件仓库 (2)指定php安装版本…...
【C/C++】语言基础知识总复习
文章目录 1. 指针1.1 数组和指针1.2 函数指针1.3 const 和 指针、static、#define、typedef1.4 指针和引用的异同1.5 sizeof与strlen 2. 库函数及其模拟实现3. 自定义类型4. 数据存储5. 编译链接过程6. C入门基础6.1 函数重载6.2 引用和指针6.3 建议使用const、inline、enum去替…...
SDXL 1.0绘图工坊:基于Docker的本地部署方案,纯离线无网络依赖
SDXL 1.0绘图工坊:基于Docker的本地部署方案,纯离线无网络依赖 1. 为什么选择本地部署SDXL 1.0 在AI绘图领域,SDXL 1.0代表了当前最先进的图像生成技术。与在线服务相比,本地部署具有三大不可替代的优势: 数据隐私保…...
Unity3D 资源逆向工程:AssetStudio 源码编译与定制化开发指南
1. 为什么需要编译AssetStudio源码 第一次接触Unity资源逆向时,我也像大多数人一样直接下载了AssetStudio的release版本。双击exe就能看到熟悉的界面,拖入apk文件就能解包,这种开箱即用的体验确实很爽。但很快我就遇到了棘手的问题࿱…...
gemma-3-12b-it多模态边界探索:对动态GIF首帧、视频缩略图的理解能力实测
gemma-3-12b-it多模态边界探索:对动态GIF首帧、视频缩略图的理解能力实测 1. 测试背景与目的 最近在多模态AI领域,Google推出的Gemma 3系列模型引起了广泛关注。特别是12B参数的指令调优版本gemma-3-12b-it,号称能够同时处理文本和图像输入…...
幻境·流金惊艳生成:从织梦令到流金光影汇聚的全过程效果对比
幻境流金惊艳生成:从织梦令到流金光影汇聚的全过程效果对比 1. 开篇:当技术遇见艺术的美妙邂逅 想象一下,你脑海中浮现出一个绝美的画面:赛博朋克都市中霓虹流淌的街道,或是水墨意境中的玄金山水。传统方式需要数小时…...
谱聚类实战:如何让声纹模型自动分辨一段录音里有几个人说话?
谱聚类在声纹识别中的应用:如何自动判断录音中的说话人数量 想象一下,你手头有一段长达两小时的会议录音,里面有五位不同声线的参与者交替发言。作为开发者,你需要设计一个系统,不仅能识别每个人的声音特征,…...
大模型微调终极指南:从基础概念到实战技巧
前言 近年来,大语言模型(LLM)的爆发式发展正在深刻改变人工智能的格局。然而,如何将这些通用模型适配到特定领域和任务,成为了开发者面临的核心挑战。本文将系统性地梳理大模型后训练的核心方法,从监督微调…...
白嫖DeepSeek、GLM、MiniMax、Kimi等大模型,每天 1亿 Token 免费领!
每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 最近折腾 AI 编程的朋友估计挺多的。这玩意儿现在进化得确实有点吓人。就拿名气最大的 Claude Code 来说,它这个命令行工具直接把写代码变成了“在线聊天”。你只要嘴上说清…...
嵌入式IMU姿态解算:轻量级卡尔曼滤波器实现Pitch/Roll估计
1. 项目概述Kalman滤波器库是一个面向嵌入式姿态解算的轻量级C语言实现,专为资源受限的MCU(如STM32F0/F1/F4系列、nRF52、ESP32等)设计。其核心工程目标明确:在无磁力计辅助、仅依赖IMU原始数据(加速度计陀螺仪&#x…...
OpenClaw+千问3.5-9B数据清洗:Excel表格异常值检测与修复
OpenClaw千问3.5-9B数据清洗:Excel表格异常值检测与修复 1. 为什么需要AI辅助数据清洗? 上周处理一份客户调研数据时,我遇到了典型的数据清洗难题——表格里混杂着空值、格式混乱的日期、重复记录和错误拼写。手动处理不仅耗时,…...
蒙特卡洛方法与科学计算十大经典算法解析
1. 蒙特卡洛方法:从赌场到科学计算的跨界革命 1946年,三位天才科学家在洛斯阿拉莫斯实验室的咖啡时间里,可能不会想到他们正在创造一种将彻底改变科学计算的方法。蒙特卡洛方法的名字来源于摩纳哥著名的赌城,这暗示了其核心思想—…...
