在学习二叉树之前先要学【先导知识】树的概念和表示方法
目录
前言
对于大量的数据而言,链表的线性访问时间太慢,不宜使用。本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行时间平均为O(logN)。在数据结构中树是非常有用的抽象概念,在本篇中我们将讨论二叉树的存储结构、二叉树的遍历和二叉排序树的实现,为后续平衡树以及高阶搜索树打下基础。
1、二叉树
二叉树(binary tree)是一棵每一个节点最多只能有两个孩子的树(度为2),当一棵树只有左孩子或者右孩子的最坏情况称为斜树;
当一棵树的度只为0或者2,我们把这种树称为满二叉树;当一棵树的节点严格按照从上到下、从左到右的的次序依次排列,我们把这种树称为完全二叉树,根据定义,满二叉树是完全二叉树的一种特殊情况;如果我们用NULL或者其他不可能出现的关键字来补满所有的空节点,那么这种树称为扩展二叉树。
同时二叉树还有些性质在考试中经常考到,这里也总结一下:
- 在第 i 层的二叉树上最多有 2^(i-1) 个节点;
- 深度为 k 的二叉树有 2^k-1 个节点;
- 假设度为0、1、2的节点分别是n0、n1、n2,由于一棵树中节点数是T,所以T = n0 + n2 + n2,而树枝(节点之间的连线)的数量是T - 1,所以T - 1 = 2 * n2 + n1,由这两个关系式可得:n0=n2+1;
- 具有 n 个节点的完全二叉树深度为( log2n)+1 向下取整;
- 由性质4可得:具有 n 个节点的完全二叉树节点按层次编号(从上到下、从左到右),如果 i = 1是根节点,那么对于任意一个节点它的双亲节点序号是 i / 2(i > 1)向下取整,如果当 2 * i > n 那么 节点 i 一定没有左孩子(也没有右孩子),2 * i + 1 > n 没有右孩子;
对于二叉树的实现,我们同样可以考虑使用顺序结构或者链式结构。使用顺序结构,因为查找迅速在比赛中可以用到,我们可以根据上述的性质5,计算出父节点和它孩子之间的下标关系;
而因为一棵二叉树最多有两个孩子,所以我们在使用链式结构的时候可以直接用指针指向它们。