二叉树效率:
在查找过程中,需要访问每层的一个节点,所以只要知道有多少层就知道操作多长时间。假设是一个满树:如表中显示
节点数 | 层 数 |
1 | 1 |
3 | 2 |
7 | 3 |
15 | 4 |
31 | 5 |
1023 | 10 |
假设第一列的节点个数为N,第二列层数为L,则 N 比 2 的L次方少一。
N = 2L - 1 --> L = log2(N + 1)
因此,常见的树的操作时间大致都是 N 以 2 为底的对数,在大O表示法中,表示为 O( logN )
如果树不满,分析起来就很困难。不过,可以认为对给定层数的树,不满的树的平均查找时间肯定比满树的要短,因为它在较低的层上完成查找的次数比满树时少。
树与其它数据结构的比较:
1)在有1000000个数据项的无序数组或者链表中,查找数据项的平均比较是500000次,但在1000000个节点的二叉树中,只需要20或更少( 通过log2(N + 1) 算出来)的比较。有序数组可以更快的找到数据项,但是插入数据项平均要移动500000个数据项,在1000000个节点的树插入数据项需要20或更少的比较,再加上很段的时间连接数据项。
2)在删除二叉树中,也是仅需要20次或更少的比较找到它,再加上一点时间找到它的后继,一点时间断开它的后继,以及连接它的后继。
因此,树对常有的数据结构存储操作都有很高的效率。
小结:
1)树是由边连接的节点组成的。
2)根是树最顶端的节点,没有父节点。
3)二叉树中,节点最多只有两个子节点。
4)二叉搜索树中,所有A节点的左边子孙节点的关键字都比A小,所有右边子孙节点的关键字都比A大。
5)树执行查找,插入,删除的时间复杂度都是 O(N)
6)节点表示保存在树中的对象。
7)查找节点需要比较关键值和节点的关键值,如果比节点关键值小则转向左边,其它则转向右边。
8)插入需要找到插入新节点的位置并且由它的父节点的子字段指向它。
9)中序遍历是按关键值升序访问节点的。
10)前序、后序遍历对解析代数表达式有用。
11)如果一个节点没有子节点,删除它只要把它的父节点的子字段设置为null即可。
12)如果一个节点只有一个子节点,删除它只要把它的子节点替换为它即可。
13)如果一个节点有两个子节点,删除它要用它的后继替换它。
14)在删除有两个子节点的节点中,会根据后继是被删节点的右子节点 还是 右子节点的左子孙节点的两个情况。