叶子结点

PTA-二叉搜索树的插入排序

醉酒当歌 提交于 2019-12-29 20:38:27
二叉搜索树的插入排序 二叉搜索树定义为: 左子树仅包含小于根结点的元素; 右子树仅包含大于根结点的元素; 左右子树均为二叉搜索树。 一棵二叉搜索树可以有不同的插入顺序。例如,对于如下的二叉搜索树 figure.png 插入序列可以是 3 2 1 4 6 5, 也可以是 3 2 4 1 6 5 但不可以是 3 2 4 5 6 1。 下面给出一棵二叉搜索树的先序遍历序列,请编写程序求出该树的插入序列个数。考虑到总数可能非常大,请输出总数对 1000000007 (10 ​9 ​​ +7)取余的结果。 输入格式: 第一行给出一个整数 N (0<N<=100),表示二叉树中元素个数; 第二行给出 N 个正整数,以空格分隔,表示二叉树的先序遍历序列; 输出格式: 在一行中输出插入序列总数。 输入样例: 6 3 2 1 4 6 5 输出样例: 10 解题思路 1、先构造杨辉三角(用于存放组合数)。 2、先根据输入的序列先序构造成一个树。 3、根据这个已经构造好的二叉树计算它的插入序列总数,具体计算方式如下 对于一个结点 1、如果是叶子结点,那么它的插入序列只有一种 2、若果只有左子树,那么它的插入序列数和他的左子树一样 3、如果只有右子树,那么它的插入序列数和他的右子树一样 4、如果左右子树都有,则它的插入序列数等于左子树的序列个数 右子树的序列个数 (组合数)C(左子树的元素个数

二叉树增删改查 && 程序实现

佐手、 提交于 2019-12-29 17:44:55
二叉排序树定义 一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。 二叉树删除节点 二叉排序树删除节点的时候为其删除后还是一个二叉排序树,要对不同的情况进行分别处理 1、p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则可以直接删除此子结点。 2、p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉排序树的特性。 3、p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法: 其一是令*p的左子树为*f的左/右(依*p是*f的左子树还是右子树而定)子树,*s为*p左子树的最右下的结点,而*p的右子树为*s的右子树; 其二是令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)-即让*f的左子树(如果有的话)成为*p左子树的最左下结点(如果有的话),再让*f成为*p的左右结点的父结点。 二叉排序树性能分析 每个结点的C(i)为该结点的层次数。最坏情况下

最优二叉树

瘦欲@ 提交于 2019-12-29 16:54:54
叶子结点的权值 :对叶子结点赋予的一个有意义的数值量。 二叉树的带权路径长度 :设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。 记为: 哈夫曼树 :给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树。 哈夫曼树的特点 : 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点. 哈夫曼算法基本思想: ⑴ 初始化:由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn}; ⑵ 选取与合并:在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和; ⑶ 删除与加入:在F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中; ⑷ 重复⑵、⑶两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树。 哈夫曼树的存储结构 设置一个数组huffTree[2n-1]保存哈夫曼树中各点的信息,数组元素的结点结构 。 数组huffTree初始化,所有元素结点的双亲、左 右孩子都置为-1; 数组huffTree的前n个元素的权值置给定值w[n]; 进行n-1次合并 3.1 在二叉树集合中选取两个权值最小的根结点,

二叉树的基础概念

妖精的绣舞 提交于 2019-12-29 11:41:34
二叉树的定义 二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。 特殊的二叉树 斜树 1 .所有结点都只有左子树的二叉树称为左斜树; 2 .所有结点都只有右子树的二叉树称为右斜树; 3.左斜树和右斜树统称为斜树。 满二叉树 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。 完全二叉树 对一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。 来源: CSDN 作者: 张同学1111 链接: https://blog.csdn.net/weixin_45655152/article/details/103172227

堆排序-HeapSort

冷暖自知 提交于 2019-12-28 04:03:22
堆排序是一种选择算法,他的时间复杂为O(nlogn)一、堆排序实现过程  (1)创建初始堆       初始化堆的时候是对所有的非叶子结点进行筛选。       最后一个非终端元素的下标是[n/2]向下取整,所以筛选只需要从第[n/2]向下取整个元素开始,从后往前进行调整。       比如,给定一个数组,首先根据该数组元素构造一个完全二叉树。       然后从最后一个非叶子结点开始,每次都是从父结点、左孩子、右孩子中进行比较交换,交换可能会引起孩子结点不满足堆的性质,所以每次交换之后需要重新对被交换的孩子结点进行调整。        void HeapAdjust(ElemType H[], int start, int end) { ElemType temp = H[start]; for(int i = 2*start + 1; i<=end; i*=2) { //因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2 if(i<end && H[i]<H[i+1])//左右孩子的比较 { ++i;//i为较大的记录的下标 } if(temp > H[i])//左右孩子中获胜者与父亲的比较 { break; } //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选 H[start]= H[i]; start = i; } H[start]=

python 实现堆和堆排序

人走茶凉 提交于 2019-12-28 04:02:47
""" 堆是一种完全二叉树,有最大堆和最小堆两种。 最大堆:对于每个非叶子结点V,V的值都比它的两个孩子结点大,称为最大堆特性(heap order property), 最大堆里面的根总是储存最大值,最小值储存在叶子结点。 最小堆:和最大堆相反,每个非叶子结点V,它的两个孩子的值都比V的值大。 """ # 实现最大堆 # 首先实现一个数组 class Array(object): def __init__(self, size=32): self._size = size self._items = [None] * size def __getitem__(self, index): return self._items[index] def __setitem__(self, index, value): self._items[index] = value def __len__(self): return self._size def clear(self, value = None): for i in range(self._size): self._items[i] = value def __iter__(self): for item in self._items: yield item # 用数组来实现堆。 # 因为堆是完全二叉树,舍某结点的下标为i, #

堆排序

僤鯓⒐⒋嵵緔 提交于 2019-12-28 04:00:47
http://www.cnblogs.com/skywang12345/p/3602162.html 堆是一种数据结构,其约束(根节点大于左右子节点——大根堆,根节点小于左右子节点——小根堆),一般用完全二叉树表示,用数组直接存储 堆排序包括两部分:1,构造堆,保证堆的性质 2,输出根节点,并调整堆(将根节点与叶子节点调换,堆的性质被打破)使得余下的节点使其仍然构成堆 堆的插入删除 堆的插入:每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于 直接插入排序 中将一个数据并入到有序区间中 // 新加入i结点 其父结点为(i - 1) / 2 void MinHeapFixup(int a[], int i) { int j, temp; temp = a[i]; j = (i - 1) / 2; //父结点 while (j >= 0 && i != 0) { if (a[j] <= temp) break; a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点 i = j; j = (i - 1) / 2; } a[i] = temp; } void MinHeapFixup(int a[], int i) { for (int j = (i - 1) / 2; (j

DS二叉树——Huffman编码与解码(不含代码框架)

孤者浪人 提交于 2019-12-27 07:25:58
DS二叉树——Huffman编码与解码(不含代码框架) 题目描述 1、问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码。 构造Huffman树时,要求左子树根的权值小于、等于右子树根的权值。 进行Huffman编码时,假定Huffman树的左分支上编码为‘0’,右分支上编码为‘1’。 2、算法 构造Huffman树算法: ⑴ 根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F={T1, T2, …, Tn},其中每棵二叉树Ti中只有一个权值为wi的根结点。 ⑵ 在F中选取两棵根结点的权值最小的树,作为左、右子树构造一棵新的二叉树,且置其根结点的权值为其左、右子树权值之和。 ⑶ 在F中删除这两棵树,同时将新得到的二叉树加入F中。 (4) 重复⑵, ⑶,直到F只含一棵树为止。 3、Huffman编码算法: ⑴ 从Huffman树的每一个叶子结点开始。 ⑵ 依次沿结点到根的路径,判断该结点是父亲结点的左孩子还是右孩子,如果是左孩子则得到编码‘0’,否则得到编码‘1’,先得到的编码放在后面。 ⑶ 直到到达根结点,编码序列即为该叶子结点对应的Huffman编码。 4、Huffman译(解)码算法: ⑴ 指针指向Huffman树的根结点,取第一个Huffman码。 ⑵ 如果Huffman码为‘0’

树型结构

谁都会走 提交于 2019-12-26 18:51:20
树型结构的基本概念 对大量的输入数据,链表的线性访问时间太慢,不宜使用。本文探讨另外一种重要的数据结构----树,其大部分时间可以保证操作的运行平均时间复杂度为O(logN),第一部分先来看一下树的一些预备知识。 首先看一下树形结构的样子,下图代表的是树型结构的一般形态: 由上图看得出 树是一些节点的集合 ,总结一下树的一些基本概念: 1、结点:树中的数据元素都称之为结点 2、根:最上面的结点称之为根,一颗树只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的根 3、父亲:结点的上层结点,如图中,结点K的父亲是E、结点L的父亲是G 4、兄弟:具有相同父亲的结点称为兄弟,图中F、G、H互为兄弟 5、结点的度:结点所拥有的子树的个数称之为结点的度,如结点B的度为3 6、树叶:度为0的结点,也叫作终端结点,图中D、K、F、L、H、I、J都是树叶 7、分支结点:度不为0的结点,也叫作非终端结点或内部结点,图中根、A、B、C、E、G都是分支结点 8、结点的层次:从根节点到树中某结点所经路径上的分支树称为该结点的层次,根节点的层次规定为1,其余结点的层次等于其父亲结点的层次+1 9、树的深度:树中结点的最大层次数,图中树的深度为4 二叉树 上面的是树的一般形态,下面看一下二叉树。 二叉树是一棵树,其中每个结点都不能有多于两个子树 。 下图展示了一颗二叉树:

数据结构树之红黑树

纵饮孤独 提交于 2019-12-26 08:13:59
红黑树简介:   红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED 或 BLACK。通过对任何一条根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径回避其他路径长处2倍,因而是近似平衡的。   树的每个结点包含 5 个属性:color,key,left,right和p。如果一个结点没有子结点或者父结点,则该结点相应的指针属性的值为NULL。我们可以把这些NULL视为指向二叉搜索树叶结点的指针,而把带关键字的结点视为树的内部结点。 红黑树的性质:   一棵红黑树是满足下面红黑性质的二叉搜索树:   1.每个结点或是红色的,或是黑色的   2.根节点是黑色的   3.每个叶结点(NULL)是黑色的   4.如果一个结点是红色的,那么他的两个子结点都是黑色的   5.对于每个结点,从该结点到其所有后代叶结点的简单路径上,包含相同数目的黑色结点   这 5 个性质中1,2,4都比较好理解。3与我们常说的(大部分数据结构书上说的)叶结点有一点点区别,如下图:    那性质5又是什么意思呢?我们再来看一个图:      由红黑树的 5 个性质可知,上幅图中左图是红黑树,而右图非红黑树。右图中满足红黑树的性质1.2.3.4,但是不满足性质5:从根节点6(不包括根节点)到各叶结点的简单路径上的黑色黑色结点个数并不相等。例如:6-1有2个,而6