叶子结点

数据结构经典十套卷之七

孤街浪徒 提交于 2020-02-02 03:26:00
一、选择题 (30 分 ) 1 .设某无向图有 n 个顶点,则该无向图的邻接表中有( )个表头结点。 (A)2n (B) n (C) n/2 (D) n(n-1) 2 .设无向图 G 中有 n 个顶点,则该无向图的最小生成树上有( )条边。 (A)n (B) n-1 (C) 2n (D)2n-1 3 .设一组初始记录关键字序列为 (60 , 80 , 55 , 40 , 42 , 85) ,则以第一个关键字 45 为基准而得到的一趟 快速排序 结果是( )。 (A)40 , 42 , 60 , 55 , 80 , 85 (B) 42 , 45 , 55 , 60 , 85 , 80 (C)42 , 40 , 55 , 60 , 80 , 85 (D) 42 , 40 , 60 , 85 , 55 , 80 4 .( ) 二叉排序树 可以得到一个从小到大的有序序列。 (A) 先序遍历 (B) 中序遍历 (C) 后序遍历 (D) 层次遍历 5 .设按照从上到下、从左到右的顺序从 1 开始对完全二叉树进行顺序编号,则编号为 i 结点的左孩子结点的编号为( )。 (A) 2i+1 (B) 2i (C)i/2 (D) 2i-1 6 .程序段 s=i=0 ; do {i=i+1 ; s=s+i ; }while(i<=n) ;的时间复杂度为( )。 (A)O(n) (B) O(nlog2n)

1004 Counting Leaves (30分)

梦想与她 提交于 2020-02-01 19:49:04
题目链接 1004 Counting Leaves 题意:给出树的总结点个数,和非叶子结点个数,然后给出非叶子结点的孩子结点,求每层的叶子结点数。 使用邻接表储存输入的数据。 然后bfs从根结点1遍历,level++.返回最大的层数。 坑点: 数据结点值不是1-n是随机的,根节点是1。 输入的数据不一定是先输入父节点。------第一次没用BFS直接输入数据的时候处理的,没有想到这种情况,搜了几个博客看到了自己的错误所在。 博客地址 # include <iostream> # include <cstdio> # include <cstring> # include <string> # include <vector> # include <queue> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std ; const int maxn = 110 ; typedef struct Tree { int val ; int high ; Tree ( int value , int h ) { val = value ; high = h ; } } Tree ; vector <

红黑树算法原理

拜拜、爱过 提交于 2020-02-01 15:58:53
原文: 红黑树深入剖析及Java实现 ,本文修改了原文的一些小错误,如果想看红黑树的Java实现可以到原文去看。 红黑树是平衡二叉查找树的一种 。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。 它的高度决定了它的查找效率。 在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。 BST的查找操作 T key = a search key Node root = point to the root of a BST while ( true ){ if (root== null ){ break ; } if (root.value.equals(key)){ return root; } else if (key.compareTo(root.value)< 0 ){ root = root.left; } else { root = root.right; } } return null ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 从程序中可以看出,当BST查找的时候

排序算法专题

久未见 提交于 2020-02-01 09:29:15
数据结构课程可能会考到的排序算法: 插入排序 希尔排序 冒泡法 快排 选择排序 堆排序 归并排序 一 插入排序 #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; void print(int a[], int n ,int i) { cout<<i <<":"; for(int j= 0; j<8; j++) { cout<<a[j] <<" "; } cout<<endl; } void InsertSort(int a[], int n) { for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 int j= i-1; int x = a[i]; //复制为哨兵,即存储待排序元素 a[i] = a[i-1]; //先后移一个元素 while(x < a[j]){ //查找在有序表的插入位置 a[j+1] = a[j]; j--; //元素后移 } a[j+1] = x; //插入到正确位置 } print(a,n,i); //打印每趟排序的结果 } } int main() { int a[8] = {3,1,5,7,2,4,9,6};

Counting Leaves【PAT 1004题】

时间秒杀一切 提交于 2020-01-31 12:36:23
题目链接: http://pat.zju.edu.cn/contests/pat-practise/1004 该题是个模拟类吧,个人觉得,题目要求计算出家谱树中每一层的叶节点个数,因为只是数数目,所以在做题的时候可以用一些小聪明省去不需要的内存开销和逻辑处理,比如不需要记录某一个结点有多少孩子,更不用提这些孩子都是哪些结点,只用记录一个值:该节点有没有孩子;还有就是记录该节点所在层数,自己确定根结点在第一层,然后根据输入的家谱关系更新所有结点的level值,所以树中节点的结构体为: 1 typedef struct2 {3 int level;//该结点所在层数4 int haveChild;//该节点有没有孩子5 int updated;//该节点的level更新过没6 }node; 程序刚开始时,每个结点的level初始化为0,程序输入家谱关系时,每个结点的level值不是简单的父节点level+1,因为父节点此时level可能并没有更新,还是处于初始状态,所以,level只是记录父节点编号,然后再用一个单独的循环,更新所有结点的level,同时记录每一层的叶节点个数,这样做使整个程序的内存开销和逻辑处理简单了很多。 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct 5 { 6 int level;/

B树和B+树的总结

旧巷老猫 提交于 2020-01-29 08:56:09
B树和B+树总结 B树 简介 这里的B树,也就是英文中的B-Tree,一个 m 阶的B树满足以下条件: 每个结点至多拥有m棵子树; 根结点至少拥有两颗子树(存在子树的情况下),根结点至少有一个关键字; 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树; 所有的叶结点都在同一层上,B树的叶子结点可以看成是一种外部节点,不包含任何信息; 有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列; 关键字数量需要满足ceil(m/2)-1 <= n <= m-1; 举个栗子: 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。 为什么B类树可以进行优化呢?我们可以根据B类树的特点,构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息,保证层数尽量的少,在B树中可以检查多个子结点,由于在一棵树中检查任意一个结点都需要一次磁盘访问,所以B树避免了大量的磁盘访问;而且B类树是平衡树

特殊二叉树

↘锁芯ラ 提交于 2020-01-28 23:52:46
一:斜树 所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。 左斜树: 右斜树: 二:满二叉树 在一棵二叉树中。如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。 满二叉树的特点有: 1)叶子只能出现在最下一层。出现在其它层就不可能达成平衡。 2)非叶子结点的度一定是2。 3)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。 满二叉树: 三: 完全二叉树 完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。 注意:满二叉树一定是一棵完全二叉树,但完全二叉树不一定是满二叉树。 特点: 1)叶子结点只能出现在最下层和次下层。 2)最下层的叶子结点集中在树的左部。 3)倒数第二层若存在叶子结点,一定在右部连续位置。 4)如果结点度为1,则该结点只有左孩子,即没有右子树。 5)同样结点数目的二叉树,完全二叉树深度最小。 //在判断一棵树是否是完全二叉树时,可以对照上面的特点进行判断。 来源: CSDN 作者: 酸菜。 链接: https://blog.csdn.net/qq_38158479/article/details/104102193

堆学习笔记

蹲街弑〆低调 提交于 2020-01-28 04:01:13
堆的基础知识 堆是一种有序的二叉树,分为大堆和小堆。其中大堆的父结点的值大于或等于子结点的值,而小堆父结点的值则小于或等于孩子结点的值。堆的特点就是根结点要么最大,要么最小,所以经常 用堆的特性来求最值 。 堆可以用数组存储。若用a[0:n]来存储堆的元素,若已知a[i]是父结点(2*i+2<=n),则a[2*i+1]和a[2*i+2]分别为左右孩子结点。或者已知a[i]为孩子结点(0<i<=n),则父结点为a[ (i-1)/2]。 堆结点的插入。堆把要插入的元素放在堆最后的叶子结点,然后再进行Up操作完成插入。若用len表示堆结点的个数,用a[n]来存储堆,堆插入num可以用一句代码实现。 a[len++] = num; 堆的Up。以大堆为例,堆的Up参考代码如图2-1所示。类似,小堆只需对 "t > a[j]" 的 ">" 换成 "<",再修改函数名称即可。 void MaxHeapUp(int a[], int i) {//a[0 : n]中第i个元素进行up操作 int t = a[i]; int j = ( i -1) / 2; while( i > 0 && t > a[j]) { a[i] = a[j]; i = j; j = ( i - 1) / 2; } a[i] = t; } 图2-1 大堆Up 堆结点的删除。删除堆结点通常是删除根结点

十大排序算法(Java实现)

。_饼干妹妹 提交于 2020-01-26 22:33:37
一、冒泡排序(Bubble Sort) public class BubbleSort { public static void main(String[] args) { int[] arr = {3, 4, 2, 9, 10, 15, 11, 0, 1}; System.out.println(Arrays.toString(bubbleSort(arr))); } public static int[] bubbleSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { for(int j = 0; j < arr.length - 1 - i; j++){ if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; } } 二、选择排序(Selection Sort) public class SelectionSort { public static void main(String[] args) { int[] arr = {3, 4, 2, 9, 10, 15, 11, 0, 1}; System.out.println(Arrays.toString

递归示例(一):遍历二叉树

心已入冬 提交于 2020-01-26 18:46:30
最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结。 递归热身 一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。 比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于直接递归。 如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。 一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。 函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。 如大家熟悉的阶乘函数,我们可以对n!作如下定义:f(n)= 1 (n=1) n*f(n-1) (n>=2) 一个算法具有的特性之一就是有穷性