数据结构-树(二叉树)-第三天

news2024/11/23 15:53:14

结合leetcode学习c++
学习资料来源

定义

二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。
与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。

在这里插入图片描述

节点定义

/* 二叉树节点结构体 */
struct TreeNode {
    int val;          // 节点值
    TreeNode *left;   // 左子节点指针
    TreeNode *right;  // 右子节点指针
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

每个节点都有两个引用(指针),分别指向左子节点(left-child node)和右子节点(right-child node),该节点被称为这两个子节点的父节点(parent node)。当给定一个二叉树的节点时,我们将该节点的左子节点及其以下节点形成的树称为该节点的左子树(left subtree),同理可得右子树(right subtree)。

二叉树常见术语

根节点(root node):位于二叉树顶层的节点,没有父节点。
叶节点(leaf node):没有子节点的节点,其两个指针均指向 None 。
边(edge):连接两个节点的线段,即节点引用(指针)。
节点所在的层(level):从顶至底递增,根节点所在层为 1 。
节点的度(degree):节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
二叉树的高度(height):从根节点到最远叶节点所经过的边的数量。
节点的深度(depth):从根节点到该节点所经过的边的数量。
节点的高度(height):从距离该节点最远的叶节点到该节点所经过的边的数量。
在这里插入图片描述

初始化

/* 初始化二叉树 */
// 初始化节点
TreeNode* n1 = new TreeNode(1);
TreeNode* n2 = new TreeNode(2);
TreeNode* n3 = new TreeNode(3);
TreeNode* n4 = new TreeNode(4);
TreeNode* n5 = new TreeNode(5);
// 构建节点之间的引用(指针)
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;

二叉树的类型

  1. 普通二叉树 (General Binary Tree):

    • 最常见的二叉树形式,其中每个节点最多有两个子节点。
    • 没有特别的结构限制。
  2. 满二叉树 (Full Binary Tree):

    • 每个节点要么没有子节点,要么恰好有两个子节点。
    • 没有度为 1 的节点。
    • 也被称为严格二叉树。
  3. 完全二叉树 (Complete Binary Tree):

    • 除了最后一层之外,每一层都是完全填满的。
    • 最后一层的所有节点都尽可能地集中在左边。
    • 完全二叉树可以用数组高效地表示,通常用于堆数据结构中。
  4. 平衡二叉树 (Balanced Binary Tree):

    • 任何两个叶节点的深度之差不超过 1。
    • 包括 AVL 树、红黑树等,这些树保证了在插入、删除等操作后的高度平衡,从而保持良好的性能。
  5. 二叉搜索树 (Binary Search Tree, BST):

    • 对于任意节点,其左子树中的所有节点的值小于该节点的值,右子树中的所有节点的值大于该节点的值。
    • 提供了高效的查找、插入和删除操作。
    • 如果树不平衡,性能可能会退化到 O(n)。
  6. AVL 树 (Adelson-Velsky and Landis Tree):

    • 一种自平衡的二叉搜索树,任何节点的两个子树的高度差至多为 1。
    • 在插入或删除节点后,树会通过旋转操作来保持平衡。
    • 保证了操作的时间复杂度为 O(log n)。
  7. 红黑树 (Red-Black Tree):

    • 另一种自平衡的二叉搜索树,通过节点着色和旋转操作来维持平衡。
    • 每个节点都有一个颜色属性(红色或黑色),并且满足特定的规则来保证平衡。
    • 通常用于实现关联容器,如 C++ STL 中的 std::mapstd::set
  8. 堆 (Heap):

    • 一种特殊的完全二叉树,通常用于实现优先队列。
    • 有两种类型:最大堆和最小堆。
    • 在最大堆中,父节点的值总是大于或等于其子节点的值;而在最小堆中,父节点的值总是小于或等于其子节点的值。
  9. 线索二叉树 (Threaded Binary Tree):

    • 通过对空指针进行线索化处理,使得二叉树可以像链表一样进行遍历,而不需要使用递归或栈。
    • 通常用于节省内存和提高遍历效率。
  10. 哈夫曼树 (Huffman Tree):

    • 一种特殊的二叉树,用于数据压缩。
    • 树的叶子节点表示字符,非叶子节点表示字符的频率。
    • 哈夫曼编码使用最短的编码表示最频繁的字符,从而实现高效的压缩。

示例代码

下面是一个简单的二叉树节点定义和一个创建二叉搜索树的示例:

#include <iostream>
using namespace std;

// 定义二叉树节点
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

// 插入节点到二叉搜索树
TreeNode* insert(TreeNode* root, int val) {
    if (!root) {
        return new TreeNode(val);
    }
    if (val < root->val) {
        root->left = insert(root->left, val);
    } else {
        root->right = insert(root->right, val);
    }
    return root;
}

// 中序遍历二叉搜索树
void inorderTraversal(TreeNode* root) {
    if (root) {
        inorderTraversal(root->left);
        cout << root->val << " ";
        inorderTraversal(root->right);
    }
}

int main() {
    TreeNode *root = NULL;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);

    cout << "Inorder traversal of the binary search tree: ";
    inorderTraversal(root);
    cout << endl;

    return 0;
}

输出

Inorder traversal of the binary search tree: 20 30 40 50 60 70 80 

总结

二叉树是一种多功能的数据结构,不同的二叉树类型适合不同的应用场景。了解每种类型的特性可以帮助你更好地选择合适的数据结构来解决问题。

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

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

相关文章

[数据集][目标检测]停车场空位检测数据集VOC+YOLO格式7959张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7959 标注数量(xml文件个数)&#xff1a;7959 标注数量(txt文件个数)&#xff1a;7959 标注…

p9 镜像的基本命令

docker的常用命令 帮助命令 查看docker的版本 docker version2. 查看当前安装的docker的详细的信息 docker的系统信息包括镜像和容器的数量 docker info3. 查询帮助命令 image是你想要获取哪一个命令的帮助文档,一般百度或者人工智能就行所有命令的可选项都可以用这个–hel…

DN专业3D图形制作软件win/mac软件安装下载(附下载链接)

目录 一、软件概述 1.1 Adobe DN简介 1.2 Windows/Mac系统要求 Windows系统&#xff1a; Mac系统&#xff1a; 二、安装步骤 2.1 下载与解压 2.2 安装程序 2.3 启动软件 三、使用教程 3.1 界面介绍 3.2 创建和编辑3D内容 3.3 合成与渲染 四、高级技巧与注意事项 …

.NET内网实战:通过DNS查找出网主机

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 03编码实现 在红队活动中&…

Modbus 数据帧解析

Modbus 是一种通信协议&#xff0c;广泛应用于工业自动化系统中&#xff0c;用于连接电子设备。它是一种基于主从结构的通信协议&#xff0c;其中主设备可以与多个从设备通信。数据通过一系列的帧进行传输&#xff0c;每一帧包含多个字段&#xff0c;每个字段都有特定的功能。 …

SQL进阶技巧:最近有效的缺失值填充问题【last_value实现版】

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 场景:现在有一张商品入库表,包括商品id、商品成本和入库日期3个字段,由于某些原因,导致部分商品的成本缺失(为0或者没有值都是缺失),这样不利于我们计算成本。所以现在要把缺失的商品进价补充完整,补充的…

OpenCTI:开源网络威胁情报平台

OpenCTI 是一个开源平台&#xff0c;旨在帮助组织管理其网络威胁情报 (CTI) 数据和可观察数据。 该平台由 Filigran 开发&#xff0c;使用基于 STIX2 标准的知识模式构建数据。 它采用现代 Web 应用程序架构&#xff0c;配备 GraphQL API 和用户友好的前端。 OpenCTI 与 MIS…

MySQL在Windows和Ubuntu上的安装与远程连接配置

MySQL是一个广泛使用的开源关系数据库管理系统&#xff0c;适用于各种操作系统。本文将详细介绍如何在Windows和Ubuntu系统上安装MySQL&#xff0c;并配置远程连接。 1. 在Windows上安装MySQL 1.1 下载MySQL安装包 首先&#xff0c;访问MySQL官方网站&#xff08;https://de…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑模块冗余和系统状态的多...电系统可靠性的蒙特卡洛分析》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【Java日志系列】JCL、SLF4J日志门面

目录 前言 一、日志门面概述 1. 门面模式&#xff08;外观模式&#xff09; 2. 日志门面 二、JCL 1. JCL组件结构 2. JCL案例 三、SLF4J 1. SLF4J简介 2. SLF4J桥接技术 3. 快速入门 4. SLF4J集成日志实现 4.1 集成nop 4.2 集成Logback 4.3 集成Log4j 4.4 集成…

一文彻底搞懂Transformer - 总体架构,零基础入门到精通,收藏这一篇就够了

Transformer 一、RNN编码器-解码器架构**** ********序列到序列模型&#xff08;Seq2Seq&#xff09;&#xff1a;Seq2Seq模型的目标是将一个输入序列转换成另一个输出序列&#xff0c;这在多种应用中都具有广泛的实用价值&#xff0c;例如语言建模、机器翻译、对话生成等。 …

网络及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

Java 入门指南:List 接口

Collection 接口提供了一系列用于操作和管理集合的方法&#xff0c;包括添加、删除、查询、遍历等。它是所有集合类的根接口&#xff0c;包括 List、Set、Queue 等。 Collection 接口常见方法 add(E element)&#xff1a;向集合中添加元素。 addAll(Collection col)&#xff1…

打架检测算法在公共安全中的创新应用

在现代社会中&#xff0c;公共场所的安全问题日益受到重视&#xff0c;特别是暴力事件的监控和预防更是各类安防系统的核心需求之一。随着视频监控设备的普及&#xff0c;如何从大量监控数据中实时、高效地识别出潜在的暴力行为&#xff0c;成为亟待解决的难题。传统的视频监控…

怎么对前端的一些按钮做一个权限校验

在一般情况下,我们需要对一些按钮做一个权限校验,来保证只有有权限的用户才能看到 1.创建一个js文件,来写我们的全局方法 我的方法是这样的 import Vue from vue;Vue.mixin({methods:{hasAuth(perm) {var authority this.$store.state.menu.permList;if (authority.indexOf(…

JointJs 在 Vue 中的使用探索(一): Hello JointJS

文章目录 前言根本问题探索过程安装 jointjs测试 joint/core demo 代码jointjs joint/core 前言 最近需要用到 JointJs 做一些东西&#xff0c;但是 官方文档 的 joint/core 跑下来后发现并不太好使&#xff0c;空白一片…&#xff08;这是个误会…&#xff09; 所以开了个贴给…

map与set容器初识:初步运用map与set

前言&#xff1a; 本文主要讲解的时对于map与set容器的初步使用&#xff0c;希望大家对map与set容器不熟悉的看了之后可以快速运用set与map到日常中来。&#xff08;本文适合对vector等基础容器有一定基础的同学&#xff09; 一、set与map容器常见接口 迭代器接口与以往的所…

【hot100篇-python刷题记录】【不同路径】

R5-多维动态规划篇 多维动态规划的核心在于建立多维状态记录表。 本题中&#xff0c;建立dp二维数组表&#xff08;初始化为1&#xff09; dp[i][j]dp[i-1][j]dp[i][j-1] 注意&#xff0c;需要判断是否存在&#xff0c;因为二维数组有边界 第一种处理需要判断边界 第二种&…

go的defer机制

defer的底层机制 为栈操作&#xff0c;栈是一个先进后出的数据结构 func main() {fmt.Println("reciprocal")for i : 0; i < 10; i {defer fmt.Println(i)} }运行结果 reciprocal 9 8 7 6 5 4 3 2 1 0defer拷贝机制 以下已经发生压栈发生值拷贝数据不再会发生变…

【Python机器学习系列】一文教你绘制多分类任务的ROC曲线-宏平均ROC曲线(案例+源码)

这是我的第345篇原创文章。 一、引言 ROC曲线是用于评估二分类模型性能的工具&#xff0c;它展示了模型在不同阈值下的真阳性率与假阳性率之间的关系&#xff0c;但是标准的ROC并不能运用于多分类任务种&#xff0c;于是扩展出了宏平均ROC曲线。 宏平均ROC曲线是多分类问题中…