二叉树搜索 - Java版

简介: 二叉树搜索 - Java版

二叉树搜索


/**
 * @Author: wangshiyu javapub rodert
 * @Date: 2021/3/28 16:11
 */
public class BSTree {

    //定义Node类
    public static class Node {
        int val;
        Node left;
        Node right;

        Node(int val) {
            this.val = val;
            this.left = null;
            this.right = null;
        }
    }

    //定义根节点
    private Node root = null;

    //查找
    public Node find(int val) {
        if (root == null) {
            return null;
        }

        Node cur = root;
        while (cur != null) {
            if (cur.val == val) {
                return cur;
            } else if (cur.val > val) {
                cur = cur.left;
            } else {
                cur = cur.right;
            }
        }

        return null;
    }

    // 插入
    // 新的节点都是插入在叶子节点或者不完全的子树上
    public boolean insert(int val) {
        if (root == null) {
            root = new Node(val);
            return true;
        }

        Node cur = root;
        Node parent = null;

        //搜索要插入的位置
        while (cur != null) {
            parent = cur;
            if (cur.val == val) {
                //保证插入的节点不重复
                return false;
            } else if (cur.val > val) {
                cur = cur.left;
            } else {
                cur = cur.right;
            }
        }

        // 找到了合适的位置,根据与父节点的大小关系建立连接
        Node node = new Node(val);
        if (val > parent.val) {
            parent.right = node;
        } else {
            parent.left = node;
        }

        return true;
    }

    //删除
    public boolean remove(int val) {
        if (root == null) {
            return false;
        }

        Node cur = root;
        Node parent = null;

        // 搜索要删除的节点
        while (cur != null) {
            if (cur.val == val) {
                break;
            } else if (cur.val > val) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }

        if (cur == null) {
            return false;
        } else {
            remove(parent, cur);
            return true;
        }
    }

    public void remove(Node parent, Node cur) {
        if (cur.left == null) {
            if (cur != root) {
                if (parent.left == cur) {
                    parent.left = cur.right;
                } else {
                    parent.right = cur.right;
                }
            } else {
                root = cur.right;
            }
        } else if (cur.right == null) {
            if (cur != root) {
                if (parent.left == cur) {
                    parent.left = cur.left;
                } else {
                    parent.right = cur.left;
                }
            } else {
                root = cur.left;
            }
        } else {
            // 左右都不为空选取一个新的节点作为子树的根
            // 1.左子树的最右节点 ---> 大于左子树中的所有节点,小于右子树中的所有节点
            // 2.右子树的最左节点 ---> 小于右子树中的所有节点,大于左子树中的所有节点
            // 以下为选取左子树的最右节点
            parent = cur;
            Node next = cur.left;

            while (next.right != null) {
                parent = next;
                next = next.right;
            }

            cur.val = next.val;
            if (parent.left == next) {
                parent.left = next.left;
            } else {
                parent.right = next.left;
            }
        }

    }

    public void inOrder() {
        inOrderInternal(root);
        System.out.println();
    }

    private void inOrderInternal(Node root) {
        if (root != null) {
            inOrderInternal(root.left);
            System.out.print(root.val + " ");
            inOrderInternal(root.right);
        }
    }


    public static void main(String[] args) {
        BSTree bs = new BSTree();
        bs.insert(10);
        bs.insert(5);
        bs.insert(6);
        bs.insert(8);
        bs.insert(3);
        bs.insert(7);
        bs.insert(2);
        bs.insert(6);
        bs.insert(11);
        bs.insert(14);
        bs.insert(12);
        bs.insert(13);
        bs.inOrder();

        bs.remove(3);
        bs.inOrder();

        bs.remove(14);
        bs.inOrder();

        bs.remove(2);
        bs.inOrder();

        bs.remove(10);
        bs.inOrder();
    }
}


目录
相关文章
|
4天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
16 4
|
1天前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
10 2
|
3天前
|
Java
Java二叉树的遍历
Java二叉树的遍历
|
4天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
13 1
|
8天前
|
算法 Java 索引
【算法】重建二叉树并进行后序遍历的Java实现
【算法】重建二叉树并进行后序遍历的Java实现
17 5
|
6天前
|
算法 搜索推荐 Java
二叉树的基本概念、常见操作以及如何使用Java代码
二叉树的基本概念、常见操作以及如何使用Java代码
10 1
|
1天前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
3 0
|
Java
java实现简单的二叉树ADT
java实现简单的二叉树ADT
135 0
|
Java 程序员
java实现简单二叉树
java实现简单二叉树
362 0
java实现简单二叉树
用Java实现一个简单二叉树
前置知识: 什么是二叉树:一个递归的树形数据结构,每个节点最多有两个子节点;二叉树一般都是二分查找树,每个节点的值大于它左子节点的值,小于它右子节点的值
810 0
用Java实现一个简单二叉树