Java实现二叉排序树(原创代码,包含插入、删除、查找)

14 篇文章 1 订阅
9 篇文章 0 订阅

二叉排序树 BST,也称二叉查找树。

二叉排序树的特点:

  1. 若左子树非空,则左子树上所有节点值均小于根节点的值。
  2. 若右子树非空,则右子树上所有节点值均大于根节点的值。

每一颗子树都是一颗二叉排序树。如下图:

下面我们直接上代码:

package com.tree.binaryTree;

//二叉排序树
public class BinaryTree {
    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode();
        treeNode.insert(50);
        treeNode.insert(25);
        treeNode.insert(70);
        treeNode.insert(21);
        treeNode.insert(35);
        treeNode.insert(60);
        treeNode.insert(84);
        treeNode.insert(13);
        treeNode.insert(30);
        treeNode.insert(40);
        treeNode.insert(56);
        treeNode.insert(67);
        treeNode.insert(86);
        treeNode.insert(32);
        treeNode.insert(38);
        treeNode.insert(58);

        treeNode.delete(35);
        treeNode.delete(50);
    }
}

class Node {
    int value;
    Node left;
    Node right;

    public Node(int value) {
        this.value = value;
    }
}

class TreeNode {
    Node root;

    /**
     * 插入节点
     */
    public void insert(int value) {
        if (root == null) {
            root = new Node(value);
            return;
        }
        Node node = root;
        while (true) {
            if (node.value > value) {
                if (node.left == null) {
                    node.left = new Node(value);
                    return;
                } else {
                    node = node.left;
                }
            } else {
                if (node.right == null) {
                    node.right = new Node(value);
                    return;
                } else {
                    node = node.right;
                }
            }
        }
    }

    /**
     * 寻找节点
     */
    public boolean search(int value) {
        Node node = root;
        while (node != null && value != node.value) {
            if (node.value > value) {
                node = node.left;
            } else {
                node = node.right;
            }
        }
        return node != null;
    }

    public void delete(int value) {
        Node node = root;
        Node temp = node;
        while (node != null) {
            //保存当前节点
            if (node.value == value) {
                //若node节点为尾巴节点,直接将node赋值为null
                if (node.left == null && node.right == null) {
                    if(temp.left == node){
                        temp.left = null;
                        return;
                    }else if(temp.right == node){
                        temp.right = null;
                        return;
                    }else {
                        root = null;
                        return;
                    }
                }
                //若node节点左子节点为空
                if (node.left == null) {
                    Node min = findMin(node.right);
                    if (min == node.right) {
                        node.value = min.value;
                        node.right = min.right;
                    } else {
                        node.value = min.left.value;
                        min.left = min.left.right;
                    }
                    return;
                }
                //若node节点左子节点不为空
                Node max = findMax(node.left);
                if (max == node.left) {
                    node.value = max.value;
                    node.left = max.left;
                } else {
                    node.value = max.right.value;
                    max.right = max.right.left;
                }
                return;
            } else {
                //往下找到value值对应的节点
                if (node.value > value) {
                    temp = node;
                    node = node.left;
                } else {
                    temp = node;
                    node = node.right;
                }
            }
        }
    }

    /**
     * 找到左子树的最大节点的前一个节点
     */
    public Node findMax(Node node) {
        if (node.right == null) {
            return node;
        }
        Node temp = null;
        while (node.right != null) {
            temp = node;
            node = node.right;
        }
        return temp;
    }

    /**
     * 找到右子树的最小节点的前一个节点
     */
    public Node findMin(Node node) {
        if (node.left == null) {
            return node;
        }
        Node temp = null;
        while (node.left != null) {
            temp = node;
            node = node.left;
        }
        return temp;
    }

}

树的原型为:

删除后为:

 

在测试过程中遇到任何问题可以debug一下,如果解决不了可以在评论区留言,我会帮助你解决问题,欢迎大家积极评论!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
排序(Binary Search Tree,BST)是一种特殊的二,它满足以下条件: - 左子中的所有节点的值均小于根节点的值; - 右子中的所有节点的值均大于根节点的值; - 左右子也分别为二排序Java代码实现排序: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinarySearchTree { private TreeNode root; // 根节点 // 插入节点 public void insert(int val) { if (root == null) { // 如果根节点为空,直接插入 root = new TreeNode(val); return; } TreeNode cur = root; while (cur != null) { if (val < cur.val) { // 小于当前节点,往左子找 if (cur.left == null) { cur.left = new TreeNode(val); return; } cur = cur.left; } else { // 大于等于当前节点,往右子找 if (cur.right == null) { cur.right = new TreeNode(val); return; } cur = cur.right; } } } // 查找节点 public boolean search(int val) { TreeNode cur = root; while (cur != null) { if (val == cur.val) { return true; } else if (val < cur.val) { cur = cur.left; } else { cur = cur.right; } } return false; } // 删除节点 public void delete(int val) { root = deleteNode(root, val); } private TreeNode deleteNode(TreeNode root, int val) { if (root == null) { // 没有找到要删除的节点 return null; } if (val < root.val) { // 继续在左子删除 root.left = deleteNode(root.left, val); } else if (val > root.val) { // 继续在右子删除 root.right = deleteNode(root.right, val); } else { // 找到要删除的节点 if (root.left == null) { // 左子为空或者左右子都为空 return root.right; } else if (root.right == null) { // 右子为空 return root.left; } else { // 左右子都不为空 TreeNode minNode = findMin(root.right); // 找到右子中最小的节点 root.val = minNode.val; // 用右子中最小的节点代替要删除的节点 root.right = deleteNode(root.right, minNode.val); // 删除右子中最小的节点 } } return root; } // 找到以root为根的二搜索的最小节点 private TreeNode findMin(TreeNode root) { while (root.left != null) { root = root.left; } return root; } } ``` 以上代码实现了二排序的基本操作:插入节点、查找节点和删除节点。其中删除节点需要考虑三种情况:左子为空、右子为空和左右子都不为空。对于第三种情况,需要在右子中找到最小的节点代替要删除的节点,然后再删除右子中最小的节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲戴王冠♛必承其重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值