深度为3的二叉查找树
平衡二叉树与倾斜的二叉树.png
在二叉搜索树b中查找x的过程为: 若b是空树,则搜索失败,否则: 若x等于b的根节点的数据域之值,则查找成功;否则: 若x小于b的根节点的数据域之值,则搜索左子树;否则: 若x大于b的根节点的数据域之值,则搜索右子树。
查找过程.png
向一个二叉搜索树b中插入一个节点s的算法,过程为: 若b是空树,则将s所指结点作为根节点插入,否则: 若s->data等于b的根节点的数据域之值,则返回,否则: 若s->data小于b的根节点的数据域之值,则把s所指节点插入到左子树中,否则: 把s所指节点插入到右子树中。(新插入节点总是叶子节点)
插入过程.png
在二叉查找树删去一个结点,有3种情况:
删除无子树的节点
删除只有一个子树
删除有两个子树的节点
定义:节点val值小于该节点val值并且值最大的节点 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode) 若一个节点没有左子树,那么判断该节点和其父节点的关系 2.1 若该节点是其父节点的右节点,那么该节点的前驱结点即为其父节点。 2.2 若该节点是其父节点的左节点,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右节点,那么Q就是该节点的前驱节点
TreeMap的Preducessor算法
如最上图所示: 3的前驱是1:当前节点有左子树,找到左子树最右的节点 10的前驱是8:当前节点没有左子树,并且是父节点的右子树 4的前驱是3:当前节点没有左子树,找到沿父节点出于左子树节点
定义:节点val值大于该节点val值并且值最小的节点 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点(也就是右子树中所谓的leftMostNode) 若一个节点没有右子树,那么判断该节点和其父节点的关系 2.1 若该节点是其父节点的左子树,那么该节点的后继结点即为其父节点 2.2 若该节点是其父节点的右子树,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的子树 ,那么Q就是该节点的后继节点
TreeMap的Successor算法
如最上图所示: 8的后继是10:当前节点有右子树,并且右子树节点无左子树 10的后继是13:当前节点有右子树,则找到右节点的右子树最小的节点 4的后继是6:当前节点是父节点的左子树,则该节点的后继即为其父节点