二叉树的基本概念
关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式,二叉树时有序树。
二叉树又有几种特殊的形式:最优二叉树(哈弗曼树)、二叉判定树、二叉排序树(二叉查找树)、二叉堆
哈弗曼树
哈弗曼树的特点就是带权路径长度最小,因此还叫最优二叉树。另外,哈弗曼树是完全二叉树。
二叉判定树
原理:对于有序的查找表,可采用折半查找,因为查找表中的元素是有序的,我们可以先确定待查元素所在查找表中的范围,然后逐步缩小查找范围直到找到或找不到为止。
算法实现:
int SearchBin(int arr[],int key){ int low=0; int high=arr.length; while(low<high){ int mid=(low+high)/2; if(arr[mid]==key) return mid; else if(arr[mid]>key) high=mid-1; else low=mid+1; } }
折半查找每进行一次比较,元素下次查找的范围将缩小为原来的一半,因此查找长度不会超过logn +1(也是树的深度),即运行时间最坏情况是O(logn)。
二叉排序树
又称“二叉查找树”、“二叉搜索树”。或者是一棵空树;或者是具有下列性质的二叉树:
1、若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2、若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3、左、右子树也分别为二叉排序树;
二叉排序树通常采用二叉链表作为存储结构。中序遍历二叉排序树可得到一个依据关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即是对无序序列进行排序的过程。二叉判定树就是一棵二叉排序树。
查找性能介于O(logn),O(n)(数列有序,树退化成线性表,如右斜树)。
平衡树
平衡二叉树又称AVL树。它或者是颗空树,或者是具有下列性质的二叉树:
1、它的左子树和右子树都是平衡二叉树,
2、左子树和右子树的深度之差的绝对值不超过1。
若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能为-1,0,1.只要二叉树上有一个节点的平衡因子的绝对值大于1,那么这颗平衡二叉树就失去了平衡。
二叉堆
二叉堆是一种优先队列的数据结构,具有2种性质:结构性质和堆序性。这里讨论都基于最小二叉堆,这种二叉堆对最小元素的访问非常高效。
二叉堆的ADT操作主要包括Insert(插入)和DeleteMin(删除最小元)。
结构性质
堆是一棵完全二叉树(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 都被填满,第 h 层所有的结点都连续集中在最左边),如下图。
(1)因为完全二叉树很有规律,因此可以用一个数组而不需要用指针存储;
(2)对于数组中任一位置i处的元素,其左儿子在位置2*i上,右儿子在2*i+1上。也正因为这样,我们可以很方便的不用指针而只用数组就能访问左右儿子。
堆序性:
由于我们想快速的找到最小元,因此最小元应在根上。我们可以以O(1)时间找到最小值。
堆序性指,在一个堆中,每一个节点X,X父亲中的关键字小于(或等于)X中的关键字,根节点除外(因为没有父亲)。
分类:小顶堆和大顶堆:
对于序列{k1,k2,....,kn} 有ki<=k2i且ki<=k(2i+1) 即根节点小于任意一个孩子节点,称为小顶堆 ki>=k2i且ki>=k(2i+1) 即根节点大于任意一个孩子节点,称为大顶堆。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/tfygg/article/details/47809905