二叉查找树
二叉查找树定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的节点。
二叉查找树的性质: 对二叉查找树进行中序遍历,即可得到有序的数列。
二叉查找树的时间复杂度:它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷
二叉查找树的插入:
- 若当前的二叉查找树为空,则插入的元素为根节点;
- 若插入的元素值小于根节点值,则将元素插入到左子树中;
- 若插入的元素值不小于根节点值,则将元素插入到右子树中。
二叉查找树的删除:
4. p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点)
-
p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可(注意分是根节点和不是根节点)
-
p的左子树和右子树均不空。找到p的后继(中序遍历的后继)y,因为y一定没有左子树(假设有那么左子树就 才是p的后继,所以p一定没有左子树),所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,最后用y的值代替p的值,同理也可以找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点