二叉树是一种特殊的树。二叉树的特色是每一个结点最多有两个儿子,左边的叫作左儿子,右边的叫作右儿子,或者说每一个结点最多有两棵子树。更加严格的递归定义是:二叉树要么为空,要么由根结点、左子树和右子树组成,而左子树和右子树分别是一棵二叉树。 下面这棵树就是一棵二叉树。
二叉树的使用范围最广,一棵多叉树也能够转化为二叉树,所以咱们将着重讲解二叉树。
二叉树中还有连两种特殊的二叉树叫作满二叉树和彻底二叉树。若是二叉树中每一个内部结点都有两个儿子,这样的二叉树叫作满二叉树。或者说满二叉树全部的叶结点都有一样的深度。好比下面这棵二叉树,是否是感受很“丰满”。满二叉树的严格的定义是一棵深度为h且有2h-1个结点的二叉树。
若是一棵二叉树除了最右边位置上一个或者几个叶结点缺乏外其它是丰满的,那么这样的二叉树就是彻底二叉树。严格的定义是:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,就是彻底二叉树。也就是说若是一个结点有右子结点,那么它必定也有左子结点。例以下面这三棵树都是彻底二叉树。其实你能够将满二叉树理解成是一种特殊的或者极其完美的彻底二叉树。
其实彻底二叉树相似下面这个形状。
说到这里咱们立刻就要领略到彻底二叉树的魅力了。先想想一棵彻底二叉树如何存储呢?其实彻底二叉树中父亲和儿子之间有着神奇的规律,咱们只需用一个一维数组就能够存储彻底二叉树。首先将彻底二叉树进行从上到下,从左到右编号。
经过上图咱们发现若是彻底二叉树的一个父结点编号为k,那么它左儿子的编号就是2*k,右儿子的编号就是2*k+1。若是已知儿子(左儿子或右儿子)的编号是x,那么它父结点的编号就是x/2,注意这里只取商的整数部分。在C语言中若是除号‘/’两边都是整数的话,那么商也只有整数部分(即自动向下取整),即4/2和5/2都是2。另外若是一棵彻底二叉树有N个结点,那么这个彻底二叉树的高度为log2 N简写为log N,即最多有log N层结点。彻底二叉树的最典型应用就是——堆。那么堆又有什么做用呢?请关注下周更新:堆——神奇的优先队列。html
欢迎转载,码字不容易啊,转载麻烦注明出处
《啊哈!算法》算法10:二叉树 http://www.ahalei.com/thread-4850-1-1.html算法