定义
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
二叉查找树的查找、插入、删除节点的算法复杂度均为(o(log(n))
查找算法
在二叉排序树b中查找x的过程为:
若b是空树,则搜索失败,否则:
若x等于b的根结点的数据域之值,则查找成功;否则:
若x小于b的根结点的数据域之值,则搜索左子树;否则:
查找右子树。
插入算法
向一个二叉排序树b中插入一个结点s的算法,过程为:
若b是空树,则将s所指结点作为根结点插入,否则:
若s->data等于b的根结点的数据域之值,则返回,否则:
若s->data小于b的根结点的数据域之值,则把s所指结点插入到左子树中,否则:
把s所指结点插入到右子树中。
删除算法
在二叉排序树删去一个结点,分三种情况讨论:
若*p结点为叶子节点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
若*p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树或右子树即可,作此修改也不破坏二叉排序树的特性。
若*p结点的左子树和右子树均不空。首先我们需要找到待删除节点的左子树上的最大值节点,或者右子树上的最小值节点,然后将该节点的参数值与待删除的节点参数值进行交换,最后删除该节点,这样需要删除的参数就从该二叉树中删除了。(虽然听起来怪怪的,但其实是正确的,可自行验证)
二叉搜索树的排序问题
遍历一棵树是指访问树的每个节点并对它们进行某种操作的过程,访问树的所有节点的方式有三种:中序、先序、后序
中序遍历是一种以上行方式访问BST所有节点的遍历方式,也就是按照从小到大的顺序访问树中所有节点。中序遍历的一种应用就是对栈进行排序操作。在遍历过程中最常使用的就是递归。
先序遍历是按照根左右的方式访问树中所有节点,先序遍历的一种应用就是打印一个结构化的文档。
后序遍历是按照左右根的方式访问树中所有节点,后序遍历的一种应用就是计算一个目录和它的子目录中的所有文件所占空间的大小。
参考:https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91/7077855