原文:https://www.cnblogs.com/daniumeng/p/8598097.html
上篇博客介绍了一种非线性结构—普通树 的含义以及一些特性,本文将介绍二叉树、满二叉树以及完全二叉树的一些特性及实现。
首先,什么是二叉树?
二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。
二叉树的重要特性:
1.二叉树的第i层上节点数最多2^(n-1)。
2.高度为k的二叉树中,最多有2^k-1个节点。
3.在任意一棵二叉树中,如果终端节点(度为0的节点)的个数为n,度为2的节点数为m,则n=m+1。
4.二叉树的子树有左右之分,顺序不能颠倒。
5.若采用连续储存的方式存放二叉树,则节点下标之间的关系:
若某个节点的下标为 i ,则这个节点的父节点的下标为 i / 2。
若某个节点下标为 i ,且节点的度为2,则这个节点的左子节点的下标为 2 * i + 1 ,右子节点的下标为 2 * i + 2 。
满二叉树:树最后一层没有任何子节点,其余每一层的所有节点都有2个子节点。
满二叉树的性质:
1.满二叉树的第i层的节点数为2^(n-1)个。
2.深度为k的满二叉树必有2k-1个节点 ,叶子数为2^k-1。
3.满二叉树中不存在度为1的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
4.具有n个节点的满二叉树的深度为log2(n+1)。
完全二叉树:如果二叉树的深度为k,则除第k层外其余所有层节点的度都为2,且叶子节点从左到右依次存在。也即是,将满二叉树的最后一层从右到左依次删除若干节点就得到完全二叉树。满二叉树是一棵特殊的完全二叉树,但完全二叉树不一定是满二叉树。
完全二叉树的性质:
1.满二叉树是一棵特殊的完全二叉树,但完全二叉树不一定是满二叉树。
2.在满二叉树中最下一层,连续删除若干个节点得到完全二叉树。
3.在完全二叉树中,若某个节点没有左子树,则一定没有右子树。
4.若采用连续储存的方式存放二叉树,则节点下标之间的关系(根节点下标为0):
若某个节点的下标为 i ,则这个节点的父节点的下标为 i / 2。
若某个节点下标为 i ,且节点的度为2,则这个节点的左子节点的下标为 2 * i + 1 ,右子节点的下标为 2 * i + 2 。
除了根节点外,左子树的下标为基数,右子树的下标为偶数。
5.如果一个完全二叉树有n个节点,则如果将其存储在数组里,最后一个节点的下标为n-1;最后一个非叶子节点的下标为n/2-1
原因:(转载自:https://www.cnblogs.com/malw/p/10542557.html)
堆排序是基于完全二叉树实现的,在将一个数组调整成一个堆的时候,关键之一的是确定最后一个非叶子节点的序号,这个序号为n/2-1,n为数组的长度。但是为什么呢?
可以分两种情形考虑:
①堆的最后一个非叶子节点若只有左孩子
②堆的最后一个非叶子节点有左右两个孩子
完全二叉树的性质之一是:如果节点序号为i,在它的左孩子序号为2*i+1,右孩子序号为2*i+2。
对于①左孩子的序号为n-1,则n-1=2*i-1,推出i=n/2-1;
对于②左孩子的序号为n-2,在n-2=2*i-1,推出i=(n-1)/2-1;右孩子的序号为n-1,则n-1=2*i+2,推出i=(n-1)/2-1;
很显然,当完全二叉树最后一个节点是其父节点的左孩子时,树的节点数为偶数;当完全二叉树最后一个节点是其父节点的右孩子时,树的节点数为奇数。
根据java语法的特征,整数除不尽时向下取整,则若n为奇数时(n-1)/2-1=n/2-1。
因此对于②最后一个非叶子节点的序号也是n/2-1。
得证。
显然序号是从0开始的。