自己在很多时候,都不怎么重视二叉树,包括在复习的时候。总觉得这个知识点很简单,但其实,二叉树是一个基础的基础。你敢保证你对它一清二楚吗?
二叉树
二叉树是n个节点的有限集,它或者是空集(n=0),或者由一个根节点及两颗互不相交的、分别称为左子树和右子树的二叉树组成。逻辑上二叉树有五种基本形态:空二叉树、只有一个根节点的二叉树、右子树为空的二叉树、左子树为空的二叉树、完全二叉树。
性质1:二叉树第i层上的节点个数最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个节点。20+21+…+2k-1=2k-1
性质3:二叉树中,叶子节点数为n0,度为2的节点数位n2,则n0=n2+1
满二叉树
满二叉树:一颗深度为k且有2k-1个节点的二叉树。
特点:每层都含2i-1个节点
完全二叉树
完全二叉树:除了最下层,其他每层都饱满,最下层的节点集中在该层最左边的若干位置上。
特点:
特点1: 满二叉树是完全二叉树,完全二叉树不一定是满二叉树
特点2: 在满二叉树的最下层,从左右边开始连续删去若干个节点后得到的二叉树仍然是一颗完全二叉树
完全二叉树可以有两种存储方式:数组存储或者链式存储。但是,通常,完全二叉树都采用数组存储。在数组存储下,完全二叉树还具有如下性质:
性质1、若i为奇数且i>1,那么i节点的左兄弟是A[i-1]
性质2、若i为偶数且i<n,那么i节点的有兄弟是A[i+1]
性质3、若i>1,那么i节点的父亲是A[i/2]
性质4、若2*i<=n,那么i的左孩子是A[2*i];若2*i<n,那么i的右孩子是A[2*i+1]
完全二叉树叶子节点的算法
设n0表示度为0的节点总数(即叶子节点数),n1表示度为1的节点总数,n2是度为2的节点总数,n是完全二叉树的节点总数。
结论:n0=(n+1)/2
证明:
由二叉树的性质可知:n0=n2+1,则n=n0+n1+n2,由上述公式得:n=2n0+n1-1。由于完全二叉树中度为1的节点数只有两种可能0或1,由此得到n0=(n+1)/2或者n0=n/2。合并得,n0=(n+1)/2,由此可根据完全二叉树的节点总数求出其叶子节点数。
注:这点会在堆排序中用到