树与二叉树
树结构是一类重要的非线性结构。树是以分支关系定义的层次结构。
树结构中有n个结点的有限集,当n=0时;称为空树;当n不为0是,为非空树。对于非空树:有且只有一个称之为根的结点。除根节点外 的其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。
树的基本术语:
结点:树中的一个独立单元。
结点的度:节点拥有的子树数称为结点的度。例如图中A的度为3。
树的度:树的度是树中各结点度的最大值。
叶子:度为0的树称为叶子。
非终端结点:度不为0的结点称为非终端节点或分支节点。
双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。
兄弟:同一个双亲的孩子称为兄弟。
祖先:从根该结点所经分支上的所有结点。
子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。
层次:结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等于双亲结点的层次加一。
堂兄弟:双亲在同一层次的结点称为堂兄弟。
树的深度:树中结点的最大层次称为树的深度或高度。
二叉树:
二叉树与树一样具有递归性质,二叉树与树的区别主要有两点:
1:二叉树每一个结点至多有两个孩子,即二叉树中不存在度大于2的树。
2:二叉树的子树有左右之分,其次序不能颠倒。
二叉树的性质:
性质1:在二叉树的第i层最多有2的(i-1)次方个结点。
性质2:深度为k的二叉树至多有2的k次方减一个结点。
性质3:对任何一棵树,如果其终端结点数为n,度为2结点数为k,则n=k-1。
满二叉树:深度为k且含有2的k次方减一个结点的二叉树。
满二叉树的特点:每一层上的结点数都是最大结点数。
完全二叉树:深度为k’的,有n个结点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中的编号从1至n的结点一一对应时,称为完全二叉树。
完全二叉树的特点:
- 叶子结点只可能在层次最大的两层上出现;
- 对任一结点,若其右分支下的子孙的最大层次为i,则其左分支下的子孙的最大层次必为i或i+1。
二叉树的遍历:(遍历结果为上图中的满二叉树的遍历结果)
1:先序遍历:
- 访问根结点;
- 先序遍历左子数;
- 先序遍历右子树;
先序遍历结果:ABDECFG
2:中序遍历:
- 中序遍历左子数
- 访问根结点
- 中序遍历右子树
中序遍历结果:DBEAFCG
3:后序遍历:
- 后序遍历左子数
- 后序遍历右子树
- 访问根结点
后序遍历结果:DEBFGCA
由二叉树的先序遍历和中序遍历,或后序遍历和中序遍历均能唯一确定一棵二叉树。由此可以知道,要确定一棵二叉树必须知道其中序遍历。
C语言代码实现
首先定义一个二叉树结构和二叉树结点结构
初始化二叉树,并将根结点设为空
按照层序法将一个数组当中的元素插入到二叉树当中。
下面是二叉树的三种遍历的代码实现:
先序遍历:
中序遍历:
后序遍历:
清空树:
查找二叉树当中值为x的结点并返回:
查看二叉树的高度:
代码演示:
代码实现当中的二叉树的三种遍历,二叉树的查找,二叉树的删除,以及查看二叉树的高度的代码实现部分都用到的了递归,还是比较难以理解的,对这部分代码不太理解的可以多看看递归方面的知识。