首页 > 编程语言 >Java实现一颗二叉搜索树的增删查改操作

Java实现一颗二叉搜索树的增删查改操作

时间:2024-07-27 17:29:15浏览次数:12  
标签:node Java val System 二叉 查改 TreeNode root public

Java实现一颗二叉搜索树的增删查改操作:

树节点:

package test.tree;


public class TreeNode {

    private int val;
    private TreeNode left;
    private TreeNode right;

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

    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
    public TreeNode getLeft() {
        return left;
    }
    public void setLeft(TreeNode left) {
        this.left = left;
    }
    public TreeNode getRight() {
        return right;
    }
    public void setRight(TreeNode right) {
        this.right = right;
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "val=" + val +
                ", left=" + left +
                ", right=" + right +
                '}';
    }
}

二叉搜索树:

package test.tree;


public class BinaryTree {

    private TreeNode root;

    public BinaryTree() {
        root = null;
    }
    public void insert(int val) {
        root = insert(root, val);
    }

    private TreeNode insert(TreeNode node, int val) {
        if (node == null) {
            node = new TreeNode(val);
        } else {
            if (val < node.getVal()) {
                node.setLeft(insert(node.getLeft(), val));
            } else {
                node.setRight(insert(node.getRight(), val));
            }
        }
        return node;
    }
    public void delete(int val) {
        root = delete(root, val);
    }
    private TreeNode delete(TreeNode node, int val) {
        if (node == null) {
            return null;
        }
        if (val < node.getVal()) {
            node.setLeft(delete(node.getLeft(), val));
        } else if (val > node.getVal()) {
            node.setRight(delete(node.getRight(), val));
        } else {
            if (node.getLeft() == null) {
                return node.getRight();
            } else if (node.getRight() == null) {
                return node.getLeft();
            }
            node.setVal(minValue(node.getRight()));
            node.setRight(delete(node.getRight(), node.getVal()));
        }
        return node;
    }
    private int minValue(TreeNode node) {
        int minVal = node.getVal();
        while (node.getLeft() != null) {
            minVal = node.getLeft().getVal();
            node = node.getLeft();
        }
        return minVal;
    }
    public TreeNode search(int val) {
        return search(root, val);
    }

    private TreeNode search(TreeNode node, int val) {
        if (node == null || node.getVal() == val) {
            return node;
        }
        if (val < node.getVal()) {
            return search(node.getLeft(), val);
        } else {
            return search(node.getRight(), val);
        }
    }
    public void modify(int oldVal, int newVal) {
        delete(oldVal);
        insert(newVal);
    }

    //    前序遍历(先遍历根节点,再遍历左子树和右子树)
    public static void preOrderTraversal(TreeNode root) {
        if (root != null) {
            System.out.print(root.getVal() + " ");
            preOrderTraversal(root.getLeft());
            preOrderTraversal(root.getRight());
        }
    }

    //    中序遍历(先遍历左子树,再遍历根节点和右子树)
    public static void inOrderTraversal(TreeNode root) {
        if (root != null) {
            inOrderTraversal(root.getLeft());
            System.out.print(root.getVal() + " ");
            inOrderTraversal(root.getRight());
        }
    }

    //    后序遍历(先遍历左子树和右子树,再遍历根节点)
    public static void postOrderTraversal(TreeNode root) {
        if (root != null) {
            postOrderTraversal(root.getLeft());
            postOrderTraversal(root.getRight());
            System.out.print(root.getVal() + " ");
        }
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        tree.insert(5);
        tree.insert(3);
        tree.insert(7);
        tree.insert(2);
        tree.insert(4);
        tree.insert(6);
        tree.insert(8);

        System.out.print("In-order traversal: ");
        inOrderTraversal(tree.root);
        System.out.println();
        System.out.println("Search for node with value 4: " + tree.search(4).getVal());

        tree.delete(5);
        System.out.print("In-order traversal: ");
        inOrderTraversal(tree.root);
        System.out.println();
        tree.modify(4, 9);
        System.out.print("In-order traversal: ");
        inOrderTraversal(tree.root);
        System.out.println();
    }
}

测试:

package test.tree;


public class TreeTest {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.setLeft(new TreeNode(2));
        root.setRight(new TreeNode(3));
        root.getLeft().setLeft(new TreeNode(4));
        root.getLeft().setRight(new TreeNode(5));
        System.out.println(root);

        System.out.print("Pre-order traversal: ");
        preOrderTraversal(root);
        System.out.println();
        System.out.print("In-order traversal: ");
        inOrderTraversal(root);
        System.out.println();
        System.out.print("Post-order traversal: ");
        postOrderTraversal(root);
    }

//    前序遍历(先遍历根节点,再遍历左子树和右子树)
    public static void preOrderTraversal(TreeNode root) {
        if (root != null) {
            System.out.print(root.getVal() + " ");
            preOrderTraversal(root.getLeft());
            preOrderTraversal(root.getRight());
        }
    }

//    中序遍历(先遍历左子树,再遍历根节点和右子树)
    public static void inOrderTraversal(TreeNode root) {
        if (root != null) {
            inOrderTraversal(root.getLeft());
            System.out.print(root.getVal() + " ");
            inOrderTraversal(root.getRight());
        }
    }

//    后序遍历(先遍历左子树和右子树,再遍历根节点)
    public static void postOrderTraversal(TreeNode root) {
        if (root != null) {
            postOrderTraversal(root.getLeft());
            postOrderTraversal(root.getRight());
            System.out.print(root.getVal() + " ");
        }
    }
}

 

标签:node,Java,val,System,二叉,查改,TreeNode,root,public
From: https://www.cnblogs.com/fengbonu/p/18327248

相关文章

  • Java热排障|Arthas(阿尔萨斯)Java诊断工具全解析
    文章目录简介为什么使用Arthas优缺点安装Arthas基本命令关键特性与应用场景常见启动异常场景及解决方案使用案例进阶功能结论简介Arthas(阿尔萨斯)是一款由阿里巴巴开源的Java诊断工具,旨在为Java开发者提供一套实时、非侵入性的应用监控和调试方案。它能够在不重启......
  • Java Kafka生产消费测试类
    JavaKafka生产消费测试类:生产者:packagetest.kafkatest;importjava.text.SimpleDateFormat;importjava.util.Properties;importjava.util.Random;importorg.apache.kafka.clients.producer.KafkaProducer;importorg.apache.kafka.clients.producer.ProducerConfig......
  • JavaSE常用类1
    常用类object类toString功能:返回对象的字符串形式object类是所有类的父类,所有类都有toString方法使用sout打印对象的引用时,会自动调用toString()返回值:全类名@hash值如果object中的toString不能满足要求,就要重写toString()==1)判断基本数据类型的值是否相同2......
  • java毕设之学生管理系统(部分源码)
    如有需要完整代码的请+vaaa5988689-------------------------------------------------------------------------------publicclassStudentSysterm{publicstaticvoidmain(String[]args){ArrayList<Student>list=newArrayList<>();/......
  • leetcode105. 从前序与中序遍历序列构造二叉树,步骤详解附代码
    leetcode105.从前序与中序遍历序列构造二叉树给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,nul......
  • 【数据结构】二叉树
    目录二叉树特殊二叉树二叉树的性质二叉树的模拟实现存储结构接口实现内部类遍历前序遍历中序遍历后序遍历遍历确定二叉树层序遍历获取节点个数获取叶子节点的个数获取第K层节点的个数获取二叉树的高度检测值为value的元素是否存在判断一棵树是不是完全二叉树练习链接......
  • 学生Java学习历程-4
    ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。这周最先开始学的仍旧是一些字词的使用instanceof,左边对象,右边为类,若对象是此类或其子类的对象,则输出true,否则输出fla......
  • Java知识点----万类之祖(Object)以及 抽象类
    1.万类之祖---Object1.1finalize()    在对象即将销毁的时候,JVM自动调用的方法    例如:publicclassObjectA(这个是自己创建的文件名)extendsObject(默认加上的)1.2hashCode这个知识点我们用一幅图来帮助大家更好的理解:2.抽象类抽象类作为父类的作......
  • JavaScript 运算符表格
    JavaScript算数运算符算数运算符用于对数字执行算数运算:运算符描述+加法-减法*乘法/除法%取模(余数)++递加--递减JavaScript赋值运算符赋值运算符向JavaScript变量赋值。运算符例子等同于=x=yx=y+=x+=yx=x+......
  • Java 学习路线
    文章目录一、JavaSE1.1基础语法1.2面向对象编程1.3函数式编程1.4字符串1.5常用API1.6集合框架1.7异常1.8文件1.9IO流1.10多线程1.11网络编程1.12反射1.13动态代理二、MySQL(待办)本篇文章,将会介绍Java的学习路线,在学习的过程中,要注重理论与实践相结合,多......