JAVA二叉树的基本操作

 更新时间:2021年08月26日 08:52:35   作者:JackHui007  
这篇文章主要介绍了JAVA二叉树的基本操作DEMO,想要详情了解的小伙伴请接着看下文吧

记录二叉树的基本操作DEMO

1、创建一个二叉树类

这里约束了泛型只能为实现了Comparable这个接口的类型。

/**
 * @author JackHui
 * @version BinaryTree.java, 2020年03月05日 12:45
 */
public class BinaryTree<T extends Comparable> {

    //树根
    BinaryTreeNode root;

    public boolean deleteData(T data) {
        if (root.data.equals(data)) {
            root = null;
            return true;
        }
        return root.deleteNode(data);
    }

    public T frontSearch(T data) {
        return (T) root.frontSearch(data);
    }

    public T midSearch(T data) {
        return (T) root.midSearch(data);
    }

    public T rearSearch(T data) {
        return (T) root.rearSearch(data);
    }

    public void frontEach() {
        this.root.frontEach();
    }

    public void midEach() {
        this.root.midEach();
    }

    public void rearEach() {
        this.root.rearEach();
    }


    public BinaryTreeNode getRoot() {
        return root;
    }

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

2、然后创建二叉树的节点

package binarytree;

/**
 * @author JackHui
 * @version BinaryTreeNode.java, 2020年03月06日 10:24
 */
public class BinaryTreeNode<T extends Comparable> {
    T data;
    BinaryTreeNode lChild;
    BinaryTreeNode rChild;

    public BinaryTreeNode(T data) {
        this.data = data;
    }

    //先序遍历
    public void frontEach() {
        System.out.print(this.data + "\t");
        if (lChild != null) {
            lChild.frontEach();
        }
        if (rChild != null) {
            rChild.frontEach();
        }
    }

    //中序遍历
    public void midEach() {
        if (lChild != null) {
            lChild.frontEach();
        }
        System.out.print(this.data + "\t");
        if (rChild != null) {
            rChild.frontEach();
        }
    }

    //后序遍历
    public void rearEach() {
        if (lChild != null) {
            lChild.frontEach();
        }
        if (rChild != null) {
            rChild.frontEach();
        }
        System.out.print(this.data + "\t");
    }

    //先序查找
    public T frontSearch(T data) {
        T target = null;
        System.out.println("[先序遍历]当前遍历到的元素:" + this.data + "\t查找的元素:" + data + "\t" + (this.data.compareTo(data) == 0 ? "查找到元素:" + data : ""));
        if (this.data.compareTo(data) == 0) {
            return data;
        } else {
            if (lChild != null && (target = (T) lChild.frontSearch(data)) != null) {
                return target;
            }
            if (rChild != null && (target = (T) rChild.frontSearch(data)) != null) {
                return target;
            }
        }
        return target;
    }

    //中序查找
    public T midSearch(T data) {
        T target = null;
        if (lChild != null && (target = (T) lChild.midSearch(data)) != null) {
            return target;
        }
        System.out.println("[中序遍历]当前遍历到的元素:" + this.data + "\t查找的元素:" + data + "\t" + (this.data.compareTo(data) == 0 ? "查找到元素:" + data : ""));
        if (this.data.compareTo(data) == 0) {
            return data;
        } else {
            if (rChild != null && (target = (T) rChild.midSearch(data)) != null) {
                return target;
            }
        }
        return target;
    }

    //后序查找
    public T rearSearch(T data) {
        T target = null;
        if (lChild != null && (target = (T) lChild.rearSearch(data)) != null) {
            return target;
        }
        if (rChild != null && (target = (T) rChild.rearSearch(data)) != null) {
            return target;
        }
        System.out.println("[后续遍历]当前遍历到的元素:" + this.data + "\t查找的元素:" + data + "\t" + (this.data.compareTo(data) == 0 ? "查找到元素:" + data : ""));
        if (this.data.compareTo(data) == 0) {
            return data;
        }
        return target;
    }

    //根据值删除节点
    public boolean deleteNode(T data) {
        System.out.println("[节点删除]当前遍历到的父节点:" + this.data + "\t" + "匹配的节点数据:" + data);
        //判断左子树是否匹配
        if (this.lChild != null && (this.lChild.data.compareTo(data) == 0)) {
            System.out.println("[节点删除]当前遍历到的父节点:" + this.data + "\t" + "匹配的节点数据:" + data + "\t节点删除成功!");
            this.lChild = null;
            return true;
        } else if (this.rChild != null && (this.rChild.data.compareTo(data) == 0)) {
            System.out.println("[节点删除]当前遍历到的父节点:" + this.data + "\t" + "匹配的节点数据:" + data + "\t节点删除成功!");
            this.rChild = null;
            return true;
        }
        if (this.lChild != null && this.lChild.deleteNode(data)) {
            return true;
        }
        if (this.rChild != null && this.rChild.deleteNode(data)) {
            return true;
        }
        return false;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public BinaryTreeNode getlChild() {
        return lChild;
    }

    public void setlChild(BinaryTreeNode lChild) {
        this.lChild = lChild;
    }

    public BinaryTreeNode getrChild() {
        return rChild;
    }

    public void setrChild(BinaryTreeNode rChild) {
        this.rChild = rChild;
    }
}

到此这篇关于JAVA二叉树的基本操作DEMO的文章就介绍到这了,更多相关JAVA二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 如何编写配置文件

    SpringBoot 如何编写配置文件

    这篇文章主要介绍了SpringBoot 编写配置文件的两种方法,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11
  • Spring中的@EnableWebSecurity注解详解

    Spring中的@EnableWebSecurity注解详解

    这篇文章主要介绍了Spring中的@EnableWebSecurity注解详解,EnableWebSecurity注解是个组合注解,它的注解中,又使用了@EnableGlobalAuthentication注解,需要的朋友可以参考下
    2023-12-12
  • java前后端加密解密crypto-js的实现

    java前后端加密解密crypto-js的实现

    这篇文章主要介绍了java前后端加密解密crypto-js的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java设计模式之工厂模式实现方法详解

    Java设计模式之工厂模式实现方法详解

    这篇文章主要介绍了Java设计模式之工厂模式实现方法,结合实例形式较为详细的分析了工厂模式的分类、原理、实现方法与相关注意事项,需要的朋友可以参考下
    2017-12-12
  • springboot中JSONObject遍历并替换部分json值

    springboot中JSONObject遍历并替换部分json值

    这篇文章主要介绍了springboot中JSONObject遍历并替换部分json值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot通过@MatrixVariable进行传参详解

    SpringBoot通过@MatrixVariable进行传参详解

    这篇文章主要介绍了SpringBoot使用@MatrixVariable传参,文章围绕@MatrixVariable展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Java多线程中的Exchanger应用简析

    Java多线程中的Exchanger应用简析

    这篇文章主要介绍了Java多线程中的Exchanger应用简析,Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方,需要的朋友可以参考下
    2023-12-12
  • Java文件管理操作的知识点整理

    Java文件管理操作的知识点整理

    这篇文章主要为大家详细介绍了Java中文件管理操作的一些知识点和实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-09-09
  • SpringBoot JPA使用配置过程详解

    SpringBoot JPA使用配置过程详解

    这篇文章主要介绍了SpringBoot JPA使用配置过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java面向对象之作用域详细解读

    Java面向对象之作用域详细解读

    这篇文章主要介绍了Java面向对象之作用域详细解读,在java编程中,主要的变量就是属性和局部变量,局部变量一般是指在成员方法中定义的变量,局部变量也就是除了属性之外的其他变量,作用域为定义他的代码块中,需要的朋友可以参考下
    2024-01-01

最新评论