叶子结点

数据结构二叉树基础以及四种遍历方式(递归和迭代)

做~自己de王妃 提交于 2020-03-02 07:27:18
数据结构二叉树基础 文章目录 数据结构二叉树基础 一、二叉树的基本概念 二、特殊的二叉树 三、二叉树的4种遍历方式 一、二叉树的基本概念 节点的度 :一个节点含有的子树的个数称为该节点的度; **树的度:**一棵树中,最大的节点的度称为树的度; 叶子节点或终端节点 :度为0的节点称为叶节点; 双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; **根结点:**一棵树中,没有双亲结点的结点; **树的高度或深度:**树中节点的最大层次 一棵二叉树 是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉 树组成。 二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒 二、特殊的二叉树 1, 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全 二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。 2, 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果 一个二叉树的层数为K,且结点总数是(2^k)

二叉排序树(Binary Sort Tree)

感情迁移 提交于 2020-03-01 01:23:33
1、定义 二叉排序树(Binary Sort Tree)又称 二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ② 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③ 左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 2、特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

MySQL AHI 实现解析

瘦欲@ 提交于 2020-02-29 13:00:08
版权声明:本文由 musazhang 原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/904925001482373849 来源:腾云阁 https://www.qcloud.com/community 前言     MySQL 定位用户记录的过程可以描述为:打开索引 -> 根据索引键值逐层查找 B+ 树 branch 结点 -> 定位到叶子结点,将 cursor 定位到满足条件的 rec 上;如果树高为 N, 则需要读取索引树上的 N 个结点并进行比较,如果 buffer_pool 较小,则大量的操作都会在 pread 上,用户响应时间变长;另外,MySQL中 Server 层与 Engine 之间的是以 row 为单位进行交互的,engine 将记录返回给 server 层,server 层对 engine 的行数据进行相应的计算,然后缓存或发送至客户端,为了减少交互过程所需要的时间,MySQL 做了两个优化: 如果同一个查询语句连续取出了 MYSQL_FETCH_CACHE_THRESHOLD(4) 条记录,则会调用函数 row_sel_enqueue_cache_row_for_mysql 将 MYSQL_FETCH_CACHE_SIZE(8) 记录缓存至 prebuilt->fetch

Java数据结构总结

懵懂的女人 提交于 2020-02-28 18:25:16
一:通过一些源码展示各种数据结构的使用方法: 1.顺序表 概念及结构 : 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改 public interface ISequence { //在pos位置插入val boolean add(int pos,Object data); //查找关键字key 找到返回key的下标,没有返回null; int search(Object key); //查找是否包含关键字key是否在顺序表当中(这个和search有点冲突) boolean contains(Object key); //得到pos位置的值 Object getPos(int pos); //删除第一次出现的关键字key Object remove(Object key); //得到顺序表的长度 int size(); //打印顺序表 void display(); //清空顺序表以防内存泄漏 void clear(); } 2.链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链 接次序实现的 。 链表的种类: 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。 带头循环单链表

树和二叉树介绍

戏子无情 提交于 2020-02-28 17:56:56
树 树形结构 是数据元素(结点)之间有分支,并且具有层次关系的结构,可用于表示数据元素之间存在的一对多关系。 树(Tree) 是由n(n≥0)个结点构成的有限集合,当n=0时称为空树。若树非空,则具有以下两个性质: (1)有且仅有一个特定的结点,称为根(Root)。 (2)其余的结点可分为m个互不相交的集合T1,T2,…,Tm,其中每一个集合都是一棵树,并且称为根的子树( Subtree)。 如下图所示是有13个结点的树,A是根,其余结点分成三个互斥的集合T1={B,E,F,K,L}、T2={C,G}、T3={D,H,I,J,M},T1、T2、T3都是A的子树,其本身也是一棵树。 树形结构图 树的基本术语: 树结点( Tree Node) :树中一个独立单元。包含一个数据元素及若干指向其子树的分支,如上图中的A、B、C、D等。 树根(Root) :树中唯一没有前驱的结点,如上图中的A结点。 结点的度( Node Degree) :结点拥有的子树数,称为结点的度。例如,在上图中A的度为3,B的度为2,K的度为0。 树的度( Tree Degree) :树中各结点的度的最大值。如上图中树的度为3。 树叶(Leaf) :度为0的结点。例如,在图中,K、L、F、G、1、J、M都是树叶,也称叶结点。除根和叶子以外的其他结点称为中间结点。 双亲( Parent)和孩子( Child)

二叉排序树结点的插入与删除操作

独自空忆成欢 提交于 2020-02-28 14:33:36
二叉排序树结点的插入与删除操作 一 二叉排序树的性质   二叉排序树,又称二叉搜索树,它最重要的性质就是: 根结点左子树中所有结点的值均小于根结点值,右子树中所有结点的值都大于根结点的值 ,所以我们在中序遍历这棵二叉树时,将会得到一个升序序列,这也是我们验证二叉排序树的一个手段。   对应的数据结构定义为: typedef struct Node { //一个数据域和左右两个指针域 int data ; struct Node * lchild , * rchild ; } Node ; 二 二叉树结点的插入 首先将待插入结点的值与根结点的值作比较,若val == root->data,此时我们直接返回当前root指针,因为我们规定,二叉排序树中不存在值相同的结点。 若待插入结点的值小于根结点的值,此时我们应该进入根结点的左子树 若待插入结点的值大于根结点的值,此时我们应该进入根结点的右子树 若指针为空,此时我们根据传入的值创建结点,并返回创建的结点指针 Node * getNewNode ( int val ) { Node * node = ( Node * ) malloc ( sizeof ( Node ) ) ; node - > data = val ; node - > lchild = node - > rchild = NULL ; return node ; }

堆排序的java实现

余生长醉 提交于 2020-02-28 13:01:07
有时利用特殊的数据结构可以极大的提高计算机的运算效率,堆排序利用了完全二叉树的便捷性,提高了排序的效率,时间复杂度为O(nlogn) 递归实现: public class HeapSort { public static void main ( String [ ] args ) { int [ ] arr = new int [ ] { 30 , 42 , 7 , 66 , 3 , 51 , 67 , 21 , 19 , 45 } ; sort ( arr ) ; } public static void sort ( int [ ] arr ) { buildHeap ( arr ) ; // 构建大顶堆 for ( int a : arr ) { System . out . print ( a + " " ) ; } // 打印 67 66 51 42 45 30 7 21 19 3 System . out . print ( "\n" ) ; int temp ; for ( int i = arr . length - 1 ; i > 0 ; i -- ) { // 依次交换堆顶(最大值)到最后一个结点 temp = arr [ 0 ] ; arr [ 0 ] = arr [ i ] ; arr [ i ] = temp ; rebuildHeap ( arr , 0

数据结构——树

[亡魂溺海] 提交于 2020-02-27 22:43:34
数据结构——树 树其实就是不包含回路的连通无向图。 树的特性: 1)一棵树中的任意两个结点有且仅有唯一的一条路径连通; 2)一棵树如果有nn个结点,则它一定有n−1n−1条边; 3)在一棵树中加一条边将会构成一个回路。 树这种数据结构的用途: 例如:家族的族谱图、公司的组织结构图、书的目录等。 1. 二叉树 二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。 二叉树用范围最广。一颗多叉树也可以转化为二叉树。 1) 满二叉树 :二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。 满二叉树是一棵深度为h且有2h−12h−1个结点的二叉树。 2) 完全二叉树 :若设二叉树的高度为hh,除了第hh层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。 特点: 由上图发现: 1)如果一棵完全二叉树的父节点编号为KK,则其左儿子的编号是2K2K,右儿子的结点编号为2K+12K+1, 公式总结: 2)已知完全二叉树的总节点数为n求叶子节点个数: 当n为奇数时:(n+1)/2 当n为偶数时 : (n)/2 3)已知完全二叉树的总节点数为n求父节点个数:为:n/2 4)已知完全二叉树的总节点数为n求叶子节点为2的父节点个数: 当n为奇数时:n/2 当n为偶数时 : n/2-1 5)如果一棵完全二叉树有N个结点,那么这棵二叉树的深度为

AlphaGo Zero算法讲解

感情迁移 提交于 2020-02-27 14:45:05
   本篇博客讲解AlphaGo Zero算法。它对比于AlphaGo的改进在于它并不是学习人类棋谱。学习人类棋谱有一定的局限,第一就是人类下棋有局限,创新比较少;第二就是人类的棋谱少。AlphaGo Zero算法通过自我对弈完成棋力提高,可以克服以上两点。在学习AlphaGo Zero之前需要先学习MCTS搜索。 MCTS搜索 首先看下公式: score = w i n i + c ln ⁡ N i n i \text{score = }\ \frac{w_i}{n_i}+c\sqrt{\frac{\ln N_i}{n_i}} score = n i ​ w i ​ ​ + c n i ​ ln N i ​ ​ ​    其中, w i w_i w i ​ 是 i i i 节点的胜利次数, n i n_i n i ​ 是 i i i 节点的模拟次数, N i N_i N i ​ 是所有模拟次数, c c c 是探索常数,理论值为 2 \sqrt{2} 2 ​ 比如对于下面的棋局,对于根节点来说,有3个选择,第一个选择7胜3负,第二个选择3胜5负,第三个选择0胜3负。 见下图,如Selection,白色为白子走,黑色为黑棋走; 11 / 21 11/21 1 1 / 2 1 表示走此棋根据经验21局11胜。对于此节点来说,有3个选择,第一个选择7胜3负,第二个选择3胜5负

排序算法

本秂侑毒 提交于 2020-02-26 02:46:09
1. 排序的基本概念与分类 (1)稳定性:关键字相等的记录在排序后没有改变起初的先后关系,那么该排序是稳定的 (2)内排序与外排序   内排序:待排序记录全部在内存里 外排序:记录数太多,排序时要在内外存之间多次交换数据   内排序:     时间性能:比较、移动     辅助空间     算法的复杂性:算法本身的复杂性   内排序主要分类:插入排序(直接插入排序、希尔排序)、交换排序(冒泡、快速)、选择排序(简单选择、堆排序)、归并排序 (3)各排序算法复杂度汇总 冒泡:O(N 2 ) 2. 排序 #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }sqList; 2.1 冒泡排序 属于交换排序   数组长为n (1)v1   从最前面开始,两两相邻元素比较。如果前面的比后面的大,就交换(升序);如果前面的比后面的小,就交换(降序)。   两层for循环,数组长为n则要进行 n-1 次大循环,每经过一个大循环,一个最大的数(或最小的数)就交换到最后面去了。   比较次数:n-1 + n-2 +...+1=(n 2 -n)/2 比较次数是固定的   交换次数:最坏是(n 2 -n)/2   稳定性:由于写的是只有大于或者小于才交换,且交换发生在相邻的元素上,所以是稳定的 1 //flag==true