码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树总结

时间:2015-08-20 19:04:30      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:二叉树   判定树   二叉排序树      二叉平衡树   

二叉树的基本概念


技术分享


关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式,二叉树时有序树。

二叉树又有几种特殊的形式:最优二叉树(哈弗曼树)、二叉判定树、二叉排序树(二叉查找树)、二叉堆


哈弗曼树
哈弗曼树的特点就是带权路径长度最小,因此还叫最优二叉树。另外,哈弗曼树是完全二叉树


二叉判定树

       原理:对于有序的查找表,可采用折半查找,因为查找表中的元素是有序的,我们可以先确定待查元素所在查找表中的范围,然后逐步缩小查找范围直到找到或找不到为止。

算法实现:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!