有序二叉树java实现

类实现:

package 树;


import java.util.LinkedList;
import java.util.Queue;

public class BinaryTree {
    public TreeNode root;
    //插入
    public void insert(int value){
        //插入成功之后要return结束方法
        TreeNode node = new TreeNode(value);
        //如果root为空的话插入
        if(root == null){
            root = node;
            return;
        }

        //定义游标遍历二叉树
        TreeNode index = root;
        while (true){
            if(index.value<value){
                //要插入的节点是大的
                if(index.right==null){
                    //插入
                    index.right=node;
                    return;
                }
                index = index.right;
            }else {
                //新插入的值小
                if(index.left==null){
                    index.left=node;
                    return;
                }
                index = index.left;
            }
        }
    }
    //广度优先搜索,借助队列实现,如果队列不为空的话就让队列头出队,将出队的左右孩子依次进队
    public void levelOrder(){
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root!=null){
            queue.add(root);
        }else {
            System.out.println("树为空,请先插入数据");
        }
        while ((!queue.isEmpty())){
            TreeNode index = queue.poll();
            System.out.print(index.value + " ");
            if(index.left!=null){
                queue.add(index.left);
            }
            if(index.right!=null){
                queue.add(index.right);
            }
        }
        System.out.println();
    }
    //先序遍历
    public void beforeOrder(TreeNode node){
        if(node == null){
            return;
        }
        System.out.print(" "+node.value+" ");
        beforeOrder(node.left);
        beforeOrder(node.right);
    }
    //中序遍历
    public void inOrder(TreeNode node){
        if(node == null){
            return;
        }
        inOrder(node.left);
        System.out.print(" "+node.value+" ");
        inOrder(node.right);
    }
    //后序遍历
    public void adterOrder(TreeNode node){
        if(node == null){
            return;
        }
        adterOrder(node.left);
        adterOrder(node.right);
        System.out.print(" "+node.value+" ");
    }
    //查找
    public TreeNode seach(int value){
        if(root==null){
            return null;
        }
        //如果不是空的话,定义一个游标,指向根节点
        TreeNode index = root;
        while (index.value!=value){
            //如果目标值大
            if(index.value<value){
                index = index.right;
            }else {
                index = index.left;
            }
            if (index==null){
                return null;
            }
        }
        return index;
    }
    //查找节点的父节点
    public TreeNode searchParent(int value){
        if (root==null){
            return null;
        }
        //如果不是空的话,定义一个游标,指向根节点
        TreeNode index = root;
        //判断treeNode是不是目标节点的父节点
        while (true){
            if((index.left!=null&&index.left.value==value)||(index.right!=null&&index.right.value==value)){
                return index;
            }else if (value>index.value&&index.right!=null){
                //目标值大,index游标往右走
                index = index.right;
            }else if (value<index.value&&index.left!=null){
                //目标值小,index游标往左走
                index = index.left;
            }else {
                //没有父节点
                return null;
            }
        }
    }
    //找一棵树中的最小值
    public int min(TreeNode node){
        TreeNode index = node;
        if(index.left!=null){
            index = index.left;
        }
        return index.value;
    }
    //找一棵树中的最大值
    public int max(TreeNode node){
        TreeNode index = node;
        if(index.right!=null){
            index = index.right;
        }
        return index.value;
    }
    //删除
    public  void delete(int value){
        if (root==null){
            System.out.println("此树为空,无需删除");
            return;
        }
        //找到要删除的目标节点
        TreeNode targer = seach(value);
        //没有找到目标节点
        if (targer==null){
            System.out.println("没有此节点");
            return;
        }
        //找目标节点的父节点
        TreeNode parent = searchParent(value);

        //分为三大类
        if (targer.left==null&&targer.right==null){
            //删除叶子节点

            //如果没有父节点
            if (parent==null){
                root = null;
                return;
            }
            //如果有父节点
            //确定要删除的节点是父节点的左孩子还是右孩子
            if (parent.left!=null&&parent.left.value==value){
                parent.left = null;
            }else {
                parent.right = null;
            }
        }else if (targer.left!=null&&targer.right!=null){
            //删除有两棵子树的节点
            //找到目标节点右子树的最小值(或者左子树的最大值)
            int min = min(targer.right);
            //删除最小值的节点
            delete(min);
            //目标节点的值被最小值覆盖
            targer.value = min;
        }else {
            //删除只有一棵字数的节点

            //如果没有父节点
            if (parent==null){
                //判断目标节点有左子树还是有右子树
                if(targer.left!=null){
                    //有左子树
                    root = targer.left;
                }else {
                    //有右子树
                    root = targer.right;
                }
                return;
            }
            //有父节点
            //确定要删除的节点是父节点的左孩子还是右孩子
            if (parent.left!=null&&parent.left.value==value){
                //要删除的节点是父节点的左孩子
                //判断目标节点有左孩子还是右孩子
                if(targer.left!=null){
                    //有左孩子
                    parent.left = targer.left;
                }else {
                    //有右孩子
                    parent.left = targer.right;
                }
            }else {
                //要删除的节点是父节点的右孩子
                //判断目标节点有左孩子还是右孩子
                if(targer.left!=null){
                    //有左孩子
                    parent.right = targer.left;
                }else {
                    //有右孩子
                    parent.right = targer.right;
                }
            }
        }
    }
}

Test测试:

package 测试;

import 树.BinaryTree;


public class TreeTest {
    public static void main(String[] args) {
//        TreeNode t1 = new TreeNode(6);
//        TreeNode t2 = new TreeNode(11);
//        TreeNode t3 = new TreeNode(18);
//        TreeNode t4 = new TreeNode(3);
//        TreeNode t5 = new TreeNode(32);
//        TreeNode t6 = new TreeNode(8);
//        TreeNode t7 = new TreeNode(16);
//
//        t1.left = t4;
//        t1.right = t6;
//        t2.left = t6;
//        t2.right = t7;
//        t3.left = t7;
//        t3.right = t5;
//        System.out.println(t1);

        BinaryTree tree = new BinaryTree();
        BinaryTree tree1 = new BinaryTree();
        tree.insert(10);
        tree.insert(15);
        tree.insert(21);
        tree.insert(8);
        tree.insert(9);
        tree.insert(1);
        tree.insert(12);
        tree.insert(19);
        System.out.println(tree.root);
        tree.levelOrder();
        tree1.levelOrder();
        System.out.print("先序遍历为:");
        tree.beforeOrder(tree.root);
        System.out.println();
        System.out.print("中序遍历为:");
        tree.inOrder(tree.root);
        System.out.println();
        System.out.print("后序遍历为:");
        tree.adterOrder(tree.root);
        System.out.println();
        System.out.println("==========================");
        System.out.println("删除之后:");
        tree.delete(15);
        System.out.print("先序遍历为:");
        tree.beforeOrder(tree.root);
        System.out.println();
        System.out.print("中序遍历为:");
        tree.inOrder(tree.root);
        System.out.println();
        System.out.print("后序遍历为:");
        tree.adterOrder(tree.root);
    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能_机器学习096_PCA主成分分析降维算法_PCA降维原理_介绍和使用_模式识别_EVD特征值分解_SVD奇异值分解---人工智能工作笔记0221

首先我来看PCA降维,可以看到在图像处理中经常用到PCA,经过对数据进行降维可以去除数据噪声,发现数据中的模式,也就是 发现数据的规律. 这里的模式识别就是 机器学习中的一个分支 就是在数据中找规律的意思 我们使用代码看一下 from sklearn.docomposition import PCA from skl…

kivy 百词斩项目 报错

AttributeError: FigureCanvasKivyAgg object has no attribute resize_event AttributeError: FigureCanvasKivyAgg object has no attribute resize_event 是一种常见的Python错误&#xff0c;当你试图访问一个对象&#xff08;在这个例子中是 FigureCanvasKivyAgg 对象&am…

六、主存储器管理,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]一、存储管理的功能1.1 存储分配1.2 存储共享1.3 存储保护1.4 存储扩充1.5 地址映射 二、内存资源管理2.1 内存分区2.1.1 静态分区与动态分区2.1.2 等长分区与异长分区 2.2 内存分配2.2.1 静态等长分区的分配2.2.2 *动态异长分区的分配 2.3 碎片与紧凑 三、界地址…

从C到C++,C++入门(2)

在C入门篇&#xff08;1&#xff09;中&#xff0c;博主为大家简单介绍了什么是C&#xff0c;以及C中的关键字&#xff0c;命名空间&#xff0c;输入与输出和缺省参数的相关知识。今天就让我们继续一起学习C的基础知识点吧&#xff01;&#xff01; 1.函数重载 1.1函数重载的概…

C# WPF入门学习主线篇(十九)—— 布局管理实战『混合布局案例』

C# WPF入门学习主线篇&#xff08;十九&#xff09;—— 布局管理实战『混合布局案例』 欢迎来到C# WPF入门学习系列的第十九篇。在前几篇文章中&#xff0c;我们详细介绍了各个布局容器的基本概念和使用方法。本篇博客将通过一个综合的实战案例&#xff0c;展示如何在WPF中使用…

Comfyui容器化部署与简介

目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;Stable Diffusion WebUI 和 ComfyUI。本文重点介绍ComfyUI的部署使用。 ComfyUI 可定制性很强&#xff0c;可以让创作者搞出各种新奇的玩意&#xff0c;通过工作流的方式&#xff0c;也可以实现更高的自动化水平…

k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA详细解释与安装

文章目录 前言VPA简介简单理解详细解释VPA的优缺点优点1.自动化资源管理2.资源优化3.性能和稳定性提升5.成本节约6.集成性和灵活性 缺点1.Pod 重启影响可用性2.与 HPA 冲突3.资源监控和推荐滞后&#xff1a;4.实现复杂度&#xff1a; 核心概念Resource Requests 和 Limits自动调…

【MySQL】(基础篇三) —— 创建数据库和表

管理数据库和表 管理数据库 创建数据库 在MySQL中&#xff0c;创建数据库的SQL命令相对简单&#xff0c;基本语法如下&#xff1a; CREATE DATABASE 数据库名;如果你想避免在尝试创建已经存在的数据库时出现错误&#xff0c;可以添加 IF NOT EXISTS 子句&#xff0c;这样如…

AI 边缘计算平台 - 6 TOPS 低功耗 RK3576

RK3576 是瑞芯微第二代 8nm 高性能 AIOT 平台&#xff0c;CPU 采用八核大小核构架&#xff08;4A72 2.2GHz 4A53 1.8GHz&#xff09;&#xff0c;以及一个 M0 协处理器。其 CPU 算力高达 58K DMIPS&#xff0c;足以应对各种复杂计算任务。搭载 Mali-G52 MC3 GPU&#xff0c;14…

vscode软件上安装 Fitten Code插件及使用

一. 简介 前面几篇文章学习了 Pycharm开发工具上安装 Fitten Code插件&#xff0c;以及 Fitten Code插件的使用。 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省…

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿&#xff0c;大家好&#xff01;今天要聊聊一个超级酷的AI新突破——GPT-4o&#xff01;最近&#xff0c;OpenAI发布了…

【报文数据流中的反压处理】

报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中&#xff0c;经常涉及到报文的数据流处理&#xff1b;为了防止数据丢失&#xff0c;和各模块的流水处理&#xff1b;因此需要到反压机制&#xff1b; 反压机制目前接触到的有两种&#xff1a;一是基…

ARM功耗管理框架之SCP

安全之安全(security)博客目录导读 目录 一、功耗管理框架中的SCP 二、SCP的示例 三、SCP固件 四、SCP启动流程 五、SCP的memory map 六、SCP与AP的通信 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f…

(三)React事件

1. React基础事件绑定 语法&#xff1a; on 事件名称 { 事件处理程序 }&#xff0c;整体上遵循驼峰命名法 App.js //项目根组件 //App -> index.js -> public/index.html(root)function App() {const handleClick () > {console.log(button被点击了)}return (<…

测试开发之自动化篇 —— 使用Selenium IDE录制脚本!

今天&#xff0c;我们开始介绍基于开源Selenium工具的Web网站自动化测试。 Selenium包含了3大组件&#xff0c;分别为&#xff1a;1. Selenium IDE 基于Chrome和Firefox扩展的集成开发环境&#xff0c;可以录制、回放和导出不同语言的测试脚本。 2. WebDriver 包括一组为不同…

ATTCK红队评估(五)

环境搭建 靶场拓扑图&#xff1a; 靶机下载地址: 漏洞详情 外网信息收集 确定目标靶机地址&#xff1a; 发现主机192.168.135.150主机是本次攻击的目标地址。探测靶机开放的端口信息&#xff1a; 目标靶机开放了两个端口&#xff1a;80、3306&#xff0c;那没什么意外的话就是…

企业如何运用信息化、智能化、数字化等技术手段规避企业合同风险?

在企业运营中&#xff0c;合同管理是至关重要的一环。它涉及到企业的各个方面&#xff0c;从供应链管理到客户关系&#xff0c;从财务交易到法律合规。然而&#xff0c;传统的合同管理方式往往存在效率低下、风险控制不足等问题。 随着信息化、智能化和数字化技术的发展&#…

go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

什么是JWT JWT,全名为JSON Web Token&#xff0c;是当下主流的一种服务端通信认证方式&#xff0c;具有轻量,无状态的特点&#xff0c;它实现了让我们在用户与服务器之间传递安全可靠的Json文本信息&#xff0c;它的使用过程主要是这样的&#xff1a; 当用户注册的时候&#x…

Linux——nginx部署

部署Nginx 构建Nginx服务器 &#xff08;实验需要DNS支持&#xff0c;或添加hosts条目&#xff0c;例如&#xff1a; &#xff09; 安装Nginx&#xff08;yum安装即可&#xff09; 安装依赖软件包&#xff1a; 重启、启用服务并查看服务状态&#xff1a; 默认页面&#xff0…

【深度学习】深度学习之巅:在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境

【深度学习】深度学习之巅&#xff1a;在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境 大家好 我是寸铁&#x1f44a; 总结了一篇【深度学习】深度学习之巅&#xff1a;在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境✨ 喜欢的小伙伴可以点点关注 &#…