树-02-二叉搜索树
二叉搜索树不仅支持快速的查找数据,还支持快速的插入和删除数据。
二叉搜索树要求,在树种的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都要大于这个节点的值。
查找
在二叉查找树中查找元素,先取根节点,当要查找的数据等于根节点就返回,当要查找的数据小于根节点的数据,就在左子树中递归查找,否则就在右子树中递归查找。这非常的类似于一个不断二分的过程,因此,二叉查找树查找数据效率非常的高。
插入
插入操作需要找到插入的位置,找位置的过程类似查找过程。同样效率很高。
删除
- 如果要删除的节点没有子节点,只需要将父节点中,指向删除节点的指针置为NULL,再释放资源。
- 如果要删除的节点有一个子节点(左节点,右节点),只需要将父节点中指向要删除节点的指针指向要删除节点的子节点,再释放资源。
- 如果要删除的节点有两个子节点就比较复杂,要找到要删除节点的右子树中的最小节点,把它替换到要删除的节点上。再删除这个最小节点并释放资源。
还有一种删除方式是将节点只标记为删除,并不会真正的删除节点。
其它操作
二叉搜索树还能快速的查找最大和最小节点。中序遍历二叉搜索树能输出有序的数据序列,时间复杂度是O(n),非常高效。
重复数据的处理
当有重复数据时,节点中可以储存链表或者能动态扩容的数组。
其它
极端情况下,二叉搜索树会退化为链表,此时不再有性能上的优势。