2024年最新【数据结构 C++】 树详解_c+

在这里插入图片描述

树的定义

树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:①有且仅有一个特定的称为根(Root)的结点;②当n>1时,其余结点可分为m(m>0)个互不相交的有限集

T

1

{T}_{1}

T1​、

T

2

{T}_{2}

T2​、… 、

T

m

{T}_{m}

Tm​,其中每一个集合本身又是一棵树,并且称为根的子树(Sub Tree)。

树的基本术语
  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 叶节点或终端节点:度为0的节点称为叶节点;
  • 非终端节点或分支节点:度不为0的节点;
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 树的度:一棵树中,最大的节点的度称为树的度;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度或深度:树中节点的最大层次;
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;
二叉树

二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。

二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

⼆叉树的种类

⼆叉树有两种主要的形式:满⼆叉树完全⼆叉树

满二叉树

在一棵二叉树中,如果所有的分支节点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树成为满二叉树。
在这里插入图片描述

完全二叉树

对一棵具有n个结点的二叉树按层序编号,如果编号为 i(1 ≤ i ≤ n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树

在这里插入图片描述

二叉树的性质
  1. 二叉树的第 i 层至多有

2

i

1

{2}^{i-1}

2i−1个结点;
2. 深度为 k 的二叉树至多有

2

k

{2}^{k}

2k-1个结点;
3. 对任何一棵二叉树T,如果其终端结点的个数(也就是叶子节点数)为

n

0

{n}_{0}

n0​,度为2的结点个数为

n

2

{n}_{2}

n2​,则

n

0

{n}_{0}

n0​=

n

2

{n}_{2}

n2​+1。(大话数据结构P143)

二叉树的遍历方法

二叉树的遍历方式主要可以分为四种:前序遍历、中序遍历、后序遍历和层序遍历。

前序遍历

简单记为中左右,也就是说先访问根节点,然后前序遍历左子树,再前序遍历右子树。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

lkCqr-1714686615926)]
[外链图片转存中…(img-QvVqk1rs-1714686615926)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B+是一种常用的数据结构,通常用于数据库和操作系统的文件系统中。它具有以下特点: - B+能够保持数据稳定有序,即所有的数据都按照一定的顺序存储在中。 - B+的插入和修改操作具有较稳定的对数时间复杂度,即O(log n)。 - B+的元素是自底向上插入的,与二叉相反。 下面是一个C++实现的B+的代码示例: ```cpp // BPulsTree.h #ifndef BPLUSTREE_H #define BPLUSTREE_H // B+节点的定义 struct Node { int *keys; // 存储关键字的数组 Node **childPointers; // 存储子节点指针的数组 bool isLeaf; // 是否为叶子节点 int numKeys; // 当前节点的关键字数量 Node *next; // 指向下一个叶子节点的指针 // 构造函数 Node(bool isLeafNode); // 插入关键字 void insert(int key); // 删除关键字 void remove(int key); // 查找关键字 bool search(int key); }; // B+的定义 class BPlusTree { private: Node *root; // 根节点 public: // 构造函数 BPlusTree(); // 插入关键字 void insert(int key); // 删除关键字 void remove(int key); // 查找关键字 bool search(int key); }; #endif ``` ```cpp // BPulsTree.cpp #include "BPulsTree.h" Node::Node(bool isLeafNode) { keys = new int[3]; // 假设每个节点最多存储3个关键字 childPointers = new Node*[4]; // 假设每个节点最多有4个子节点 isLeaf = isLeafNode; numKeys = 0; next = nullptr; } void Node::insert(int key) { // 插入关键字的逻辑 // ... } void Node::remove(int key) { // 删除关键字的逻辑 // ... } bool Node::search(int key) { // 查找关键字的逻辑 // ... } BPlusTree::BPlusTree() { root = nullptr; } void BPlusTree::insert(int key) { // 插入关键字的逻辑 // ... } void BPlusTree::remove(int key) { // 删除关键字的逻辑 // ... } bool BPlusTree::search(int key) { // 查找关键字的逻辑 // ... } ``` ```cpp // Demo.cpp #include "BPulsTree.h" #include <iostream> int main() { BPlusTree tree; tree.insert(10); tree.insert(20); tree.insert(30); tree.insert(40); tree.insert(50); std::cout << "Search 30: " << (tree.search(30) ? "Found" : "Not found") << std::endl; std::cout << "Search 60: " << (tree.search(60) ? "Found" : "Not found") << std::endl; return 0; } ``` 这是一个简单的B+C++实现示例,其中包含了B+节点的定义和B+的操作方法。你可以根据需要进行插入、删除和查找操作。在示例中,我们创建了一个B+对象,并插入了一些关键字,然后进行了查找操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值