数据结构查找算法之二叉查找树(二叉排序树)【附Java代码实现,图解】

  • 基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。
  • 二叉查找树或者是空树,或者是具有以下特征:
    • 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    • 任意节点的左、右子树也分别为二叉查找树。
  • 复杂度分析:它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。(最坏的情况为树结构变成了链表)
/**
* 二叉排序树中查找某关键字时,首先将被查找值同树的根结点进行比较,会有 3 种不同的结果:
* 1、如果相等,查找成功;
* 2、如果比较结果为根结点的关键字值较大,则说明该关键字可能存在其左子树中;
* 3、如果比较结果为根结点的关键字值较小,则说明该关键字可能存在其右子树中;
*/
//使用循环实现查找关键字
public BiTree searchBST1(BiTree bitree, dataType key){
    Bitree tree = bitree;
    while(bitree != null && tree.val != key){
        if(tree.val > key)
            tree = tree.left;
        else if(tree.val > key)
            tree = tree.right;
    }
    return tree;
}
//使用递归实现查找关键字
public BiTree searchBST(BiTree bitree, dataType key){
    if(bitree == null || bitree.val == key)
        return bitree;
    else if(bitree.val > key)
        return searchBT(bitree.left, key)
    else if(bitree.val < key)
        return searchBT(bitree.right, key)
}
/**
 * 二叉排序树本身是动态查找表的一种表示形式,有时会在查找过程中插入或者删除表中元素,当因为查找失败而
 * 需要插入数据元素时,该数据元素的插入位置一定位于二叉排序树的叶子结点,并且一定是查找失败时访问的最
 * 后一个结点的左孩子或者右孩子。
 * 插入成功返回true,如果树中有该元素不需要插入则返回false
 */
public boolean InsertBST(BiTree bitree, dataType key){
    if(bitree == null){
        bitree.val = key;
        return true;
    }
    
    if(bitree.val == key)
        return false;
    else if(bitree.val > key)
        return insertBST(bitree.left, key);
    else if(bitree.val < key)
        return insertBST(bitree.right, key);
}
/**
* 假设要删除的为结点 p,则对于二叉排序树来说,需要根据结点 p 所在不同的位置作不同的操作,有以下 3 种可能:
* 1、结点 p 为叶子结点,此时只需要删除该结点,并修改其双亲结点的指针即可;
* 2、结点 p 只有左子树或者只有右子树,如果 p 是其双亲节点的左孩子,则直接将 p 节点的左子树或右子树
*   作为其双亲节点的左子树;反之也是如此,如果 p 是其双亲节点的右孩子,则直接将 p 节点的左子树或右
*   子树作为其双亲节点的右子树;
* 3、结点 p 左右子树都有,此时有两种处理方式:
*   1)令结点 p 的左子树为其双亲结点的左子树;结点 p 的右子树为其自身直接前驱结点的右子树,如图 3 所示;
*   2)用结点 p 的直接前驱(或直接后继)来代替结点 p,同时在二叉排序树中对其直接前驱(或直接后继)做删除
*      操作。如图 4 为使用直接前驱代替结点 p:(这种方式更好,因为这样可以最大程度的保证原树的结构,而且
*      不会让树过于倾斜)
*/
public void deleteBST(BiTree p){
    //情况1,p为叶子节点,直接删除即可
    if(p.left == null && p.right == null)
        p == null;
    else if(p.left == null)     //左子树为空,只需用结点 p 的右子树根结点代替结点 p 即可;
        p = p.right;
    else if(p.right == null)    //右子树为空,只需用结点 p 的左子树根结点代替结点 p 即可;
        p = p.left;
    else{   //左右子树均不为空,采用第 2 种方式
        BiTree b = p.left;
        //循环遍历,找到p的直接前驱
        while(b.right != null)
            b = b.right;
        //如果p的直接前驱b有左子树,则将左子树放在b的位置
        if(b.left != null)
            b = b.left;
        p.val = b.val;      //删除p节点,用其原来直接前驱的元素代替
    }
}

image.pngimage.png

 

图解Java数据结构算法

06-21
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二、二与数组转换、二排序(BST)、AVL、线索二、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法实现机制,开阔编程思路,提高优化程序的能力。

java数据结构算法

11-22
做一门精致,全面详细的 java数据结构算法!!! 让天下没有难学的数据结构, 让天下没有难学的算法, 不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发??? 总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱 话不多说,牛不多吹,我们要讲的本门课程内容: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二、二与数组转换、二排序(BST)、AVL、线索二、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值