二叉搜索树(二叉排序树)—Java(上)

简介: 二叉搜索树(二叉排序树)—Java(上)

🔎概念

二叉搜索树又称二叉排序树

可以是一棵空树

也可以不是一棵空树(doge)

上图所示就是一棵二叉搜索树

根节点root值为7,root的左子树的值全部比root的值小,root的右子树的值全部比root的值大

root.left–>root的左子树的根节点4,其左侧节点的值1比4小,右侧节点的值6比4大(但它们均小于7)

root.right–>root的右子树的根节点11,其左侧节点的值9比11小,右侧节点的值13比11大(但它们均大于7)


🔎模拟实现二叉树

🌻find–>查找二叉树中的元素

public TreeNode find(int val) {
        TreeNode cur = root;
        while(cur != null) {
            if(cur.val < val) {
                cur = cur.right;
            }else if(cur.val > val) {
                cur = cur.left;
            }else {//cur.val == val-->find!
                return cur;
            }
        }
        //未找到
        return null;
}

查找二叉搜索树中指定的val值

如果cur节点的值小于要查找的元素的值,cur = cur.right–>去树的右侧查找

如果cur节点的值大于要查找的元素的值,cur = cur.left–>去树的左侧查找


🌻insert–>在二叉树中插入元素

public void insert(int val) {
        if(root == null) {
            root = new TreeNode(val);
            return;
        }
        TreeNode pre = null;//叶子节点
        TreeNode cur = root;
        while(cur != null) {
            pre = cur;
            if(cur.val < val) {
                cur = cur.right;
            }else if(cur.val > val){
                cur = cur.left;
            }else {//二叉搜索树中不要插入相同的数据(无意义)
                return;
            }
        }
        if(val < pre.val) {
            pre.left = new TreeNode(val);
        }else {
            pre.right = new TreeNode(val);
        }
}

如果该搜索树是一棵空树,则插入的元素就是这棵树的root(根节点)

如果不是,在叶子节点的左/右侧插入对应的元素


🌻inorder–>中序遍历二叉树

public void inOrder(TreeNode root) {
        if(root == null) return;
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
}
• 1
• 2
• 3
• 4
• 5
• 6

🌻remove–>删除二叉树中的元素

cur–>要删除的节点 / pre–>要删除节点的父节点 / root–>根节点

  • 二叉搜索树的删除
  • cur.left == null–>要删除节点的左侧为空
    1)cur是根节点,root = cur.right
    2)cur不是根节点,cur是父节点的左,pre.left = cur.right
    3)cur不是根节点,cur是父节点的右,pre.right = cur.right
  • cur.right == null–>要删除节点的右侧为空
    1)cur是根节点,root = cur.left
    2)cur不是根节点,cur是父节点的左,pre.left = cur.left
    3)cur不是根节点,cur是父节点的右,pre.right = cur.left
  • cur.left != null && cur.right != null–>要删除节点的左右均不为空
    1)找cur左子树的右叶子节点–>左子树的最大值–>最大值的右节点一定为null
    2)找cur右子树的左叶子节点–>右子树的最小值–>最小值的左节点一定为null
    3)不可以是左子树的左叶子节点(左子树最小值) or 右子树的右叶子节点(右子树最大值)

🌼cur.left == null–>要删除节点的左侧为空

cur是根节点,root = cur.right

cur不是根节点,cur是pre节点的左,pre.left = cur.righ

cur不是根节点,cur是pre节点的右,pre.right = cur.right


🌼cur.right == null–>要删除节点的右侧为空

cur是根节点,root = cur.left

cur不是根节点,cur是pre节点的左,pre.left = cur.left

cur不是根节点,cur是pre节点的右,pre.right = cur.left


相关文章
|
22小时前
|
存储 Java
1038. 从二叉搜索树到更大和树 --力扣 --JAVA
给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下, 二叉搜索树 满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
39 1
|
21小时前
|
Java BI
Java 实现二叉排序树(BST)
Java 实现二叉排序树(BST)
10 0
|
21小时前
|
Java
java如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。
这段内容介绍了Java中使用AVL树实现高效二叉搜索树的方法。AVL树是一种自平衡树,节点子树高度差不超过1,确保操作时间复杂度为O(log n)。代码包括了`Node`类和`AVLTree`类,实现了节点、插入、删除、查找和平衡旋转等方法。通过旋转操作,维持树的平衡,保证了搜索效率。
16 6
|
21小时前
|
Java
LeetCode题解-二叉搜索树中第K小的元素-Java
LeetCode题解-二叉搜索树中第K小的元素-Java
13 0
|
22小时前
|
算法 C++ Java
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
24 0
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
|
22小时前
|
存储 Java Serverless
二叉搜索树 和 哈希表 (JAVA)
【1月更文挑战第1天】阿里云初体验 二叉搜索树 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除 哈希表 哈希冲突 闭散列 线性探测法 二次探测法 开散列 二叉搜索树又称二叉排序树,它具有以下性质的二叉树或空树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的每颗子树也分别为二叉搜索树 而哈希表是一种插入/删除/查找时间复杂度都是O(1)的数据结构,它的查询之所以也可以如此之快的的原因就是它在查找时不需要经过任何比较,直接一次从表中得到要搜索的元素。
38 0
二叉搜索树 和 哈希表 (JAVA)
|
22小时前
|
存储 算法 Java
230. 二叉搜索树中第K小的元素 --力扣 --JAVA
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
122 3
|
22小时前
|
Java
98. 验证二叉搜索树 --力扣 --JAVA
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 -2^31 <= Node.val <= 2^31 - 1
31 0
98. 验证二叉搜索树 --力扣 --JAVA
|
算法 Java
二叉搜索树及Java实现
二叉搜索树及Java实现
162 0
二叉搜索树及Java实现
|
21小时前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。