有序二叉树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);}
}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3288 android7.1 实现ota升级时清除用户数据

一&#xff0c;OTA简介(整包&#xff0c;差分包) OTA全称为Over-The-Air technology(空中下载技术)&#xff0c;通过移动通信的接口实现对软件进行远程管理。 1. 用途&#xff1a; OTA两种类型最大的区别莫过于他们的”出发点“&#xff08;我们对两种不同升级包的创建&…

【马琴绿绮】马维衡古琴之马氏汉风 明代杉木制;周身髹朱红色漆

【马琴绿绮式】马维衡古琴之马氏汉风 明代杉木制&#xff1b;琴体周身髹朱红色漆&#xff0c;鹿角霜灰胎&#xff1b;形体壮硕、风格高古&#xff1b;音色松透、浑厚&#xff0c;音质纯净&#xff0c;按弹舒适&#xff0c;手感丝滑。

Effective Java 2 遇到多个构造器参数时要考虑使用构建器

第2个经验法则&#xff1a;用遇到多个构造器参数时要考虑使用构建器&#xff08;consider a builder when faced with many constructor parameters&#xff09; 上一条讨论了静态工厂相对于构造器来说有五大优势。但静态工厂和构造器有个共同的局限性:它 们都不能很好地扩展到…

springcloudalibaba项目注册nacos,在nacos上修改配置项不生效问题

一、背景 之前的项目启动正常,后来发现springcloudalibaba的各版本匹配不正确,于是对项目中的springboot、springcloud、springcloudalibaba版本进行匹配升级,nacos1.4.2匹配的springboot、springcloud、springcloudalibaba版本与我的项目中的版本比较接近,于是我便重新安…

零基础入门篇①⑦ Python可变序列类型--集合

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…

算法家族之一——二分法

目录 算法算法的打印效果如果算法里的整型“i”为1如果算法里的整型“i”为11 算法的流程图算法的实际应用总结 大家好&#xff0c;我叫 这是我58&#xff0c;现在&#xff0c;请看下面的算法。 算法 #define _CRT_SECURE_NO_WARNINGS 1//<--预处理指令 #include <stdi…

中国宠业新锐品牌展,2024苏州国际宠物展6月28日开展!

中国宠业新锐品牌展&#xff0c;2024苏州国际宠物展6月28日开展&#xff01; ​ 第2届华东国际宠物用品展览会(苏州)暨中国宠业新锐品牌展&#xff0c;将于6月28日-30日在苏州国际博览中心盛大举办&#xff0c;锁定年中市场黄金档期&#xff0c;同期以“NB展&#xff0c;更新鲜…

非线性模型预测控制NMPC例子

NMPC概述 非线性模型预测控制(Nonlinear Model Predictive Control, NMPC)是一种用于控制非线性系统的高级控制策略。与线性MPC不同,NMPC需要处理系统的非线性特性,这使得优化问题更加复杂。NMPC通常使用迭代优化算法来求解非线性优化问题 NMPC基本原理 NMPC的目标是最小…

微服务之基本介绍

一、微服务架构介绍 1、微服务架构演变过程 单体应用架构->垂直应用架构一>分布式架构一>SOA架构-->微服务架构 ① 单体应用架构 互联网早期&#xff0c; 一般的网站应用流量较小&#xff0c;只需一个应用&#xff0c;将所有功能代码都部署在一起就可以&#x…

从哲学层面谈稳定性建设

背景 我&#xff08;姓名&#xff1a;黄凯&#xff0c;花名&#xff1a;兮之&#xff09;在阿里工作了五年&#xff0c;一直在一个小团队从事电商的稳定性工作。看了很多稳定性相关的文档&#xff0c;很少有能把稳定性说明白的文档。也有一些文档也能把涉及的方方面面说清楚&a…

【代码随想录】【算法训练营】【第32天】 [122]买卖股票的最佳时机II [376]摆动序列 [53]最大子序和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 32&#xff0c;一个不上班的周六&#xff0c;坚持一了一点~ 题目详情 [122] 买卖股票的最佳时机II 题目描述 122 买卖股票的最佳时机II 解题思路 前提&#xff1a;单链表 删除元素 思路&a…

Linux基础I/O

一&#xff0c;系统文件I/O 写文件: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main() {umask(0);int fd open("myfile", O_WRO…

doris FE 在Windows环境下编译调试开发环境

前言&#xff1a; doris fe 在win下调试运行&#xff0c;和正常java项目有一些差异&#xff0c;主要是有与be&#xff08;c&#xff09;通信代码的生成 在win环境下不能直接生成&#xff0c;因此需要现在linux下生成之后&#xff0c;再拷贝到本地来&#xff0c;然后进行编译&a…

C++笔试强训day42

目录 1.最大差值 2.兑换零钱 3.小红的子串 1.最大差值 链接https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId182&tqId34396&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficulty2&judgeSta…

每日5题Day19 - LeetCode 91 - 95

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;91. 解码方法 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int numDecodings(String s) {int n s.length();//注意我们dp的范围是n1int[] d…

面试官:前端实现图片懒加载怎么做?这不是撞我怀里了嘛!

前端懒加载&#xff08;也称为延迟加载或按需加载&#xff09;是一种网页性能优化的技术&#xff0c;主要用于在网页中延迟加载某些资源&#xff0c;如图片、视频或其他媒体文件&#xff0c;直到它们实际需要被用户查看或交互时才进行加载。这种技术特别适用于长页面或包含大量…

【JavaEE】Spring IoCDI详解

一.基本概念 1.Ioc基本概念 Ioc: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 什么是控制反转呢? 也就是控制权反转. 什么的控制权发发了反转? 获得依赖对象的过程被反转了也就是说, 当需要某个对象时, 传统开发模式中需要自己通…

美银美林:看好铜价涨到12000美元,这类铜矿企业弹性更大

美银美林指出&#xff0c;考虑到能源转型以及AI投资热潮对铜的需求巨大&#xff0c;到2026年铜供需缺口有望扩大一倍。给予紫金矿业、江西铜业等多家巨头买入评级&#xff0c;并认为一旦铜价上行&#xff0c;KGHM等规模较小、成本较高的企业的利润增长可能更为显著。 高盛、花…

python中while循环实现九九乘法表

i 1while i < 9: # 控制行的循环j 1while j < i: # 控制每行的输出print(f"{j}*{i}{j * i}\t", end"")j 1print()i 1运行截图&#xff1a;

Cweek4+5

C语言学习 十.指针详解 6.有关函数指针的代码 代码1&#xff1a;(*(void (*)())0)(); void(*)()是函数指针类型&#xff0c;0是一个函数的地址 (void(*)())是强制转换 总的是调用0地址处的函数&#xff0c;传入参数为空 代码2&#xff1a;void (*signal(int, void(*)(int))…