一、为什么使用二叉树?
因为二叉树结合了有序数组,链表这两者的优点。在树中查找数据的速度和有序数组中查找一样快。并且插入数据和删除数据的速度和链表一样。
二、在有序数组中插入数据项太慢
有序数组:数组中的所有数据项都有序的排列。用二分查找可以在有序数组中快速查找特定的值。
过程是先查看数组的中间的数据,如果中间数据比想要的大,缩写范围,在前半段找。反复过程查找的复杂度就是O(logN)。
在有序数组中插入一个新数据,必须要找到新数据插入的位置,然后把所有比新数据大的向后移动一位。这样每次移动都很费时,平均要移动数组中一半的数据(N/2次移动),同理删除也是要多次移动。时间复杂度为O(N)
三、在链表中查找太慢
链表的插入和删除操作都很快,只需要改变一些指针的指向就可以。这些操作的时间复杂度只有O(1).但是在链表中查找数据可不容易。查找必须从头开始,依次访问链表中的每个元素。直到找到所要的数据。因此平均访问N/2个数据项。
不难想到可以通过有序的链表来加快查找速度,链表中的数据项有序的,但这样做没有用的。即使是有序的链表还是必须从头开始依次访问数据项,因为链表中不能直接访问某个数据项,必须通过数据项间的链式引用才行当然有序链表访问结点还是比无序链表快多了,但是查找任意的数据项它无能为力。
四、用树解决问题
二叉树:树中每个结点最多只能有两个子节点。这样的树为二叉树。
二叉搜索树:一个节点的左子节点的关键字值小于父节点,右子值大于等于父节点。