二叉树
1. 基本概念
1.1 树
树形结构是一中一对多的结构,而之前的链式结构是一对一的。
树(Tree)是 n (n >=0) 个结点的有限集合。n=0 时称为空树。
在任意一棵非空树中:
- 有且仅有一个特定的称为根(Root)的结点。
- 当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集。
- 每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
1.2 结点分类
- 结点拥有的子树称为结点的度(Degree)。
- 度为 0 的结点称为叶结点(Leaf)或终端结点。度不为 0 的结点称为非终端结点或分支结点。
- 分支结点也叫做内部结点(除根结点)。
- 树的度是树内各结点的度的最大值。
1.3 结点间关系
- 结点的子树的根被称为该结点的孩子,该结点称为孩子的双亲。
- 同一个双亲的孩子之间互称兄弟。
- 结点的祖先是从根到该结点所经分支上的所有结点。
- 以某结点为根的子树中的任一结点都称为该结点的子孙。
2. 二叉树概念
2.1 二叉树特点
-
二叉树(Binary Tree),是一种树型结构,它的特点是每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能颠倒。
-
二叉树有基本五种形态:空二叉树、只有一个根节点、根结点只有左子树、根结点只有右子树、根结点既有左子树也有右子树。
-
三个结点二叉树也是有五种形态的,因为二叉树是区分左右顺序的。
2.2 特殊二叉树
斜树
- 左斜树:所有的结点都只有左子树。
- 右斜树:所有的结点都只有右子树。
满二叉树
-
所有的分支结点都存在左子树和右子树。
-
叶子只能出现在最下一层,出现在其他层不能达成平衡。
-
非叶子结点的度一定是2。
-
在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。
完全二叉树
- 除去最后一层后就变成满二叉树。
- 最后一层的结点必须依次从左往右边排。
- 叶子结点只能出现在最下两层。
- 最下层的叶子一定集中在左部连续位置。
- 倒数二层,若有叶子结点,一定都在右部连续位置。
- 如果结点度为1,则该结点只有左孩子,不存在右子树的情况。
- 同样结点树的二叉树,完全二叉树深度最小。
2.4 二叉树的性质
- 在二叉树的第 i 层上至多有 2^( i-1 ) 个结点(i >= 1)。
- 深度为 k 的二叉树至多有 ( 2^k ) - 1 个结点。
- 任何一颗二叉树 T,如果其终端结点树为 n0,度为 2 的结点树为 n2,则 n0 = n2 + 1。
- 具有 n 个结点的完全二叉树的深度为 ( log2n )+1 向下取整。
- 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
- 若 i=1,则该结点是二叉树的根,无双亲。否则,编号为 [i/2] 的结点为其双亲结点;
- 若 2i>n,则该结点无左孩子。否则,编号为 2i 的结点为其左孩子结点;
- 若 2i+1>n,则该结点无右孩子结点。否则,编号为2i+1 的结点为其右孩子结点。
2.5 二叉树的存储结构
二叉树的存储结构有一样有顺序存储和线性存储。
- 顺序存储结构
二叉树的顺序存储结构就是把一个普通的二叉树,填补成一棵完全二叉树,然后自上而下,自左到右,按1到n编号,然后依次把数据保存到数组里。
顺序存储结构的二叉树会对存储空间造成极大的浪费,所以顺序存储结构一般只用于完全二叉树。
- 链式存储结构
链式存储结构就是利用指针的指向关系把每个结点链接起来,以构成逻辑上的树状结构,可以更合理的利用内存空间。所以它也叫做二叉链表。
2.6 二叉树的遍历
二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。
二叉树的遍历有四种方式:
- 前序遍历
规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再谦前序遍历右子树,如图遍历顺序为:ABDGHCEIF。
- 中序遍历
规则是若树木为空,则空操作返回,否则从根结点开始(不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后遍历右子树木。如图遍历顺序为:GDHBAEICF。
- 后序遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。如图遍历顺序为:GHDBIEFCA。
- 层序遍历
规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
冒泡排序
冒泡排序是一种简单的交换排序。
基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。