Java实现二叉查找树(插入、查找、遍历、删除)

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode parent;
    public TreeNode(int val) {
        this.val = val;
    }
}

class BSTree{
    TreeNode root;

    public BSTree(TreeNode root) {
        this.root = root;
    }

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    /**
     * 插入递归
     */
    public TreeNode insertNode(TreeNode root, TreeNode t){
        if(root == null) {
            root = t;
        }
        else if(root.val < t.val) {
            TreeNode rgt = insertNode(root.right,t);
            root.right = rgt;
            rgt.parent = root;
        }
        else if(root.val > t.val) {
            TreeNode ltf = insertNode(root.left,t);
            root.left = ltf;
            ltf.parent = root;
        }
        return root;
    }

    /**
     * 查找--递归
     *
     */
    public  TreeNode searchNode(TreeNode root,int x){
        if(root == null) {
            return null;
        }
        else if(root.val > x){
            return searchNode(root.left,x);
        }
        else if(root.val < x){
            return searchNode(root.right,x);
        }
        else {
            return root;
        }
    }
    /**
     * 中序遍历-递归
     */
    public  void inOrder(TreeNode root){
        if(root!=null){
            inOrder(root.left);
            System.out.print(root.val+" ");
            inOrder(root.right);
        }
    }

    /**
     * 找到节点的后继节点
     */
    private TreeNode getSuccessorNode(TreeNode node){
        TreeNode target = node.right;
        if(target == null) {
            return null;
        }else{
            while(target.left != null){
                target = target.left;
            }
        }
        return target;
    }

    /**
     * 删除值为x的节点
     * 1、删除的节点是叶子节点
     * 2、删除的节点仅有左子树或右子树
     * 3、删除的节点既有左子树又有右子树
     *
     */
    public void delete(TreeNode root,int x){
        if(root==null){
            return ;
        }
        TreeNode t = root,pnt = null;
        //找到这个节点
        t = searchNode(root,x);
        if(t == null) {
            return ;
        }
        pnt = t.parent;
        if(t.left == null && t.right == null){ //节点是叶子节点
            if(t == root) { //节点是根节点
                root = null;
            }else{
                if(pnt.left == t){ //节点是父节点的左孩子
                    pnt.left = null;
                }else{//节点是父节点的右孩子
                    pnt.right = null;
                }
            }
        }
        else if(t.left != null && t.right == null){ //待删除的节点只有左孩子
            if(t == root){
                root = t.left;
            }else{
                if(pnt.left == t){
                    pnt.left = t.left;
                }else{
                    pnt.right = t.left;
                }
            }
        }
        else if(t.left == null && t.right != null){//待删除的节点只有右孩子
            if(t == root){
                root = t.right;
            }else{
                if(pnt.left == t){
                    pnt.left = t.right;
                }else{
                    pnt.right = t.right;
                }
            }
        }
        else{ //待删除的节点既有左孩子又有右孩子
            TreeNode successor = getSuccessorNode(t);
            //后继节点的值赋给待删除节点,然后删除后继节点
            t.val = successor.val;
            //后继节点的左孩子为空
            TreeNode pntOfSuccessor = successor.parent;
            if(pntOfSuccessor == t){
                t.right = successor.right;
            }else{
                pntOfSuccessor.left = successor.right;
            }
        }
    }
}

public class BSTTest {

    public static void main(String[] args){
          int[] nodeVal = {10,30,8,12,5,9,15,14,17,25,36,32,31,34};
          BSTree bsTree = new BSTree(new TreeNode(20));
          TreeNode root = bsTree.getRoot();
          for(int i=0;i<nodeVal.length;i++){
              if(bsTree.searchNode(root,nodeVal[i]) == null){
                  bsTree.insertNode(root,new TreeNode(nodeVal[i]));
              }
          }
          bsTree.inOrder(root);
          System.out.println("\n删除节点9");
          bsTree.delete(root,9);
          bsTree.inOrder(root);
          System.out.println("\n删除节点12");
          bsTree.delete(root,12);
          bsTree.inOrder(root);
          System.out.println("\n删除节点36");
          bsTree.delete(root,36);
          bsTree.inOrder(root);
          System.out.println("\n删除节点10");
          bsTree.delete(root,10);
          bsTree.inOrder(root);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是一份基本的二叉查找树Java 实现代码: ``` public class BinarySearchTree { private Node root; private class Node { private int key; private Node left; private Node right; public Node(int key) { this.key = key; this.left = null; this.right = null; } } public BinarySearchTree() { root = null; } public void insert(int key) { root = insert(root, key); } private Node insert(Node node, int key) { if (node == null) { node = new Node(key); return node; } if (key < node.key) { node.left = insert(node.left, key); } else if (key > node.key) { node.right = insert(node.right, key); } return node; } public void delete(int key) { root = delete(root, key); } private Node delete(Node node, int key) { if (node == null) { return null; } if (key < node.key) { node.left = delete(node.left, key); } else if (key > node.key) { node.right = delete(node.right, key); } else { if (node.left == null) { return node.right; } else if (node.right == null) { return node.left; } node.key = findMin(node.right).key; node.right = delete(node.right, node.key); } return node; } private Node findMin(Node node) { while (node.left != null) { node = node.left; } return node; } public boolean search(int key) { return search(root, key); } private boolean search(Node node, int key) { if (node == null) { return false; } if (key == node.key) { return true; } else if (key < node.key) { return search(node.left, key); } else { return search(node.right, key); } } public void inorderTraversal() { inorderTraversal(root); } private void inorderTraversal(Node node) { if (node != null) { inorderTraversal(node.left); System.out.print(node.key + " "); inorderTraversal(node.right); } } } ``` 这份代码实现二叉查找树的基本操作,包括插入删除、搜索和中序遍历。你可以根据自己的需求进行修改和拓展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wsws100

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

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

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

打赏作者

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

抵扣说明:

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

余额充值