树和图是典型的非线性数据结构
树的定义:
树是n(n>=0)个节点的有限集。当n=0时,成为空树。在任意一个非空树中,有如下特点:
- 有且只有一个特定的节点成为根节点
- 当n>1时,其余节点可分为m(m>0)个互不相干的有限集,每个集合本身也是一个树,并成为根的子树。
树的最大层级数,称为树的高度或者深度
二叉树的定义:
二叉树的是指该树的每个节点最多有2个子节点,有可能时两个,也可能只有1个,或者是没有
二叉树的两种特殊形式:
满二叉树:一个二叉树的所有非叶子节点都存在左孩子和右孩子,并且所有叶子节点都在同一层级上,这个树就是满二叉树
完全二叉树:一个二叉树的`最后一个节点之前`所有非叶子节点都存在左孩子和右孩子,并且所有叶子节点都在同一层级上
二叉树的物理存储结构
1.链式存储结构
采用链表的存储结构,二叉树的每一个节点包含3个部分
- 存储数据的data变量
- 指向左孩子的left指针
- 指向右孩子的right指针
2.数组
使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或者右孩子空缺,则数组的相应位置也空出来
为什么这么设计呢?因为这样可以方便地在数组中定位二叉树的孩子节点和父节点
假设一个父节点的下标是parent,那么它的左孩子节点的下标就是2parent+1,右孩子节点的下标就是2parent+2。
反过来。假设一个左孩子节点的下标是leftchild,那么它的父节点下标就是(leftchild-1)/2
显然,对于一个稀疏的二叉树来说,用数组表示法是非常浪费空间的。
然而因为完全二叉树的特殊性,用数组来存储是非常合适的,比如二叉堆,一种特殊的完全二叉树
二叉树的应用
二叉树有很多种的形式,除一般二叉树外,由上面提到的满二叉树,完全二叉树,还有二叉堆等等
那么这么多种的二叉树有哪些作用呢?
- 用于查找操作
- 维持元素间的相对顺序
二叉查找树
又名二叉排序树,二叉搜索树等等。顾名思义,这种二叉树的元素间有一定的顺序,且方便查找
定义:
- 如果左子树不为空,则
左子树上所有节点的值均小于根节点的值