1. 树结构示意图

补充:

兄弟节点:具有相同父节点的节点互称为兄弟节点。

树的深度:从根节点开始(其深度为0)自顶向下逐层累加的。上图中,3的深度是1,6的深度是2,10的深度是3。

节点高度:从叶子节点开始(其高度为0)自底向上逐层累加的。6的高度是1,根节点1的高度是3。


2. 二叉树(Binary Tree)

任何一个节点的子节点数量不超过2(子节点分为左节点与右节点)。

2.1 满二叉树(Full Binary Tree)

  • 所有叶子结点都在最后一层
  • 节点的总数为2^n-1(n为树的高度)。

2.2 完全二叉树(Complete Binary Tree)

  • 所有叶子结点都在最后一层或倒数第二层。
  • 最后一层的叶子结点在左边连续,倒数第二节的叶子结点在右侧连续。

2.3 平衡二叉树(Balanced Binary Tree)

  • 也叫 AVL 树。
  • 它是一颗空树或左右两个子树的高度差的绝对值不超过1。
  • 左右两个子树均为平衡二叉树。

2.4 二叉搜索树(Binary Search Tree)

  • 也叫二叉查找树、二叉排序树。
  • 若子树不空,则子树上所有节点的值均小于或等于根节点的值。
  • 若右子树不空,则右子树所有节点的值均大于或等于根节点的值。
  • 左、右子树也分别为二叉排序树,或是一颗空树。

2.5 红黑树(Red Black Tree)

  • 每个节点都带有颜色属性(颜色为红或黑)的平衡二叉查找树。
  • 节点是红色或黑色。
  • 根节点是黑色。
  • 所有叶子结点都是黑色。
  • 每个红色节点必须有两个黑色的子节点(从每个叶子到根的所有路径上不能有两个连续的红色节点)。
  • 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

3. B 树

B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。

3.1 B- 树

B-树 就是指 B树,也是一种用于查找的平衡树,但是它不是二叉树,B树可以拥有多于2个子节点,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。这种数据结构常被应用在数据库和文件系统的实作上。

  • 定义任意非叶子结点最多只有M个儿子;且M>2。
  • 根结点的儿子数为[2, M]。
  • 除根结点以外的非叶子结点的儿子数为[M/2, M]。
  • 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)。
  • 非叶子结点的关键字个数=指向儿子的指针个数-1。
  • 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]。
  • 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树。
  • 所有叶子结点位于同一层。

3.2 B+ 树

B+树 是 B树 的变体,也是一种多路搜索树

  • 其定义基本与B-树相同,除了:
  • 非叶子结点的子树指针与关键字个数相同。
  • 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)。
  • 为所有叶子结点增加一个链指针。
  • 所有关键字都在叶子结点出现。

特性:

  1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的。
  2. 不可能在非叶子结点命中。
  3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层。
  4. B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针。
  5. 更适合文件索引系统。

3.3 B* 树

是 B+树 的变体,在 B+树 的非根和非叶子结点再增加指向兄弟的指针

特性:

  1. B**树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。
  2. B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。

所以,B*树分配新结点的概率比B+树要低,空间使用率更高。


本篇到此完结,如有补充内容随时更新!欢迎关注本号继续跟进技术干货的更新!

c#二叉树 取叶子节点个数_图文并茂方式轻松掌握数据结构之二叉树和B树!相关推荐

  1. c#二叉树 取叶子节点个数_二叉树的最小深度+完全二叉树的节点个数

    二叉树的最小深度 题目:给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明:叶子节点是指没有子节点的节点. 示例 1: 输入:root = [3,9,20 ...

  2. c#二叉树 取叶子节点个数_数据结构第四章:树与二叉树(二叉树的概念、性质、特殊二叉树)...

    第四章:树与二叉树(二叉树的逻辑结构) 1.二叉树 二叉树是树结构的一种,故二叉树也是逻辑结构. 二叉树:二叉树是n(n≥0)个结点的有限集合. · 1)n=0时,二叉树为空; · 2)n>0时 ...

  3. c#二叉树 取叶子节点个数_两种类似但是原理不同的算法求二叉树的所有叶子节点和...

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完. 目前我选择C语言,Python和Java作为实现语言,因为这三种 ...

  4. 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数

    分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...

  5. java 获取叶子节点个数_数据结构编程: 统计二叉树中叶子结点的个数。

    展开全部 叶子节点:没有孩子节点的节点 也就是说,当我们明白了叶子节点的定义62616964757a686964616fe59b9ee7ad9431333363376531后,只需要遍历一遍二叉树,把 ...

  6. 统计二叉树的叶子节点个数

    #include <iostream> #include <queue>using namespace std;typedef struct node {char data;s ...

  7. 给定一棵二叉树,计算该二叉树的深度、总节点个数和叶子节点个数。

    // // binary_tree.cpp // BinaryTreeApp // // Created by ljpc on 2018/5/3. // Copyright © 2018年 ljpc. ...

  8. 【数据结构】二叉树的节点总个数、叶子节点个数、第K层节点个数、二叉树的深度

    目录 1.结点总个数 1.1 局部静态变量法 思维 代码 不足之处 2.传指针法 程序代码 3.递归法 思想 程序代码 详细过程 2.叶子节点个数 思想 程序代码 3.第K层节点个数 思想 程序代码 ...

  9. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  10. c++用递归计算二叉树的叶子节点的个数

    c++用递归计算二叉树的叶子节点的个数 二叉树的叶子节点是左右节点均为NULL的节点,这也判断递归的条件,直接上代码 int num_tree(Btree *tree,int&count){i ...

最新文章

  1. 利用OpenCV的函数createTrackbar创建滑动条查看二值化的最优阈值的源码及讲解
  2. 联想服务器网卡型号怎么看,如何通过设备硬件ID判断无线网卡的品牌及型号
  3. Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串
  4. string类的构造函数,拷贝构造函数,析构函数和赋值函数
  5. 面向对象的三特性(继承、多态、封装 )Python
  6. socket网络编程-字典
  7. 如何建立网页快捷方式linux,怎么创建linux命令”快捷方式”或”自定义命令”...
  8. 蓝桥杯基础练习 杨辉三角形Python实现
  9. SSM框架原理以及流程简略
  10. 笔记本计算机无法上无线网络,笔记本电脑无线网络连接不上的原因和解决办法...
  11. IntelliJ IDEA 如何设置author头注解
  12. java halt_System.exit和Runtime halt区别
  13. 回撤率 python_最大回撤和最大回撤率的区别?
  14. 用JS实现贪吃蛇小游戏
  15. 新手上路遇到的Whitelabel Error Page解决方案
  16. ASp.net判断文件或文件夹是否存在
  17. FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
  18. 前端学习之浏览器缓存
  19. 基于云计算的智能楼宇控制系统
  20. 学java需要装jdk吗_JAVA基础之JDK安装

热门文章

  1. html中不支持什么元素,html5新元素和html不支持的元素
  2. 字符串函数---atof()函数详解及实现
  3. php 微信登录 扫码 h5,【小程序】WeAuth微信小程序实现PC网站扫码授权登录
  4. java spark 教程_Spark基础教程——向Spark传递函数(Java篇)
  5. 先进科技计算机视觉,CEEC科技Corner第四期开讲:《3D计算机视觉技术发展与应用》...
  6. php更新记录没有获取值,php – 节点更新:获取旧值
  7. linux 安装wordpress
  8. 一个关于数组数据检查的问题,有没有更好的方法。
  9. nginx1.8.0安装
  10. 《Javascript秘密花园》学习笔记(下)