有序二叉树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;我们对两种不同升级包的创建&…

SolidityFoundry 安全审计测试 Delegatecall漏洞

名称&#xff1a;Delegatecall漏洞 描述&#xff1a; 代理合约所有者操纵漏洞&#xff0c;是智能合约设计中的一个缺陷&#xff0c;允许攻击者操纵代理合约所有者。该漏洞允许攻击者操纵代理合约的所有者&#xff08;这里我们把所有者硬编码为 0xdeadbeef&#xff09;。漏洞产…

牛客多校Ancestor(lca,集合的lca)

题目描述 NIO is playing a game about trees. The game has two trees A,BA, BA,B each with NNN vertices. The vertices in each tree are numbered from 111 to NNN and the iii-th vertex has the weight viv_ivi​. The root of each tree is vertex 1. Given KKK key n…

PHP实名认证接口开发示例、银行卡实名认证API

在互联网技术多元化、高速的发展下&#xff0c;催生出在挑战中不断奋勇前进的互联网企业。但不能忽视的是&#xff0c;互联网技术的快速迭代也会使部分企业在冲击中败下阵来&#xff0c;面临淘汰的危机。随着O2O、共享经济等新兴商业形式的兴起&#xff0c;企业对实名认证业务的…

如何使用Python中的列表解析(list comprehension)进行高效列表操作

Python中的列表解析&#xff08;list comprehension&#xff09;是一种创建列表的简洁方法&#xff0c;它可以在单行代码中执行复杂的循环和条件逻辑。列表解析提供了一种快速且易于阅读的方式来生成新的列表。 以下是一些使用列表解析进行高效列表操作的示例&#xff1a; 1.…

用Python编写自动发送每日电子邮件报告的脚本

为了用 Python 编写自动发送每日电子邮件报告的脚本&#xff0c;你可以使用 smtplib 库来发送电子邮件&#xff0c;使用 email 库来创建电子邮件内容。此外&#xff0c;你可以使用 schedule 库来安排每天发送邮件的任务。以下是一个示例脚本以及如何设置和运行它的指导。 步骤…

JSON如何处理包含特殊字符的字段

在JSON中处理包含特殊字符的字段时&#xff0c;你通常不需要直接处理这些特殊字符&#xff0c;因为JSON格式本身就会对特殊字符进行转义。当你使用编程语言或工具来生成或解析JSON时&#xff0c;这些转义通常是自动处理的。 然而&#xff0c;如果你需要手动处理或理解这些转义…

华为策略流控

以下脚本仅做参考&#xff0c;具体IP地址和接口请按照现场实际情况写入。 [Huawei]acl 3001 [Huawei-acl-adv-3001]rule permit ip source 192.168.1.10 0.0.0.0 destination 192.168.2.10 0.0.0.0 //匹配需要做测试的源和目标地址 [Huawei-acl-adv-3001]rule permit ip sour…

[AIGC] CompletableFuture的重要方法有哪些?

CompletableFuture具有多种方法&#xff0c;使其成为异步编程的强大工具。在这里&#xff0c;我们将介绍一些最重要和常用的方法&#xff1a; CompletableFuture<T> supplyAsync(Supplier<T> supplier): 使用ForkJoinPool.commonPool()作为线程池来异步执行Suppile…

力扣2781.最长合法子字符串的长度

力扣2781.最长合法子字符串的长度 将字符串数组存入哈希表 枚举所有右端点反向遍历子串在哈希表中找所有以i为右端点的字符串若找到相同子串 更新j k 1 class Solution {public:int longestValidSubstring(string word, vector<string>& forbidden) {unordered_…

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

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

C++ 课堂实验 读取a.txt中文本,统计文本中字母数量

题目描述:读取a.txt中文本&#xff0c;统计文本中字母数量。 相关知识&#xff08;略&#xff09; 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End处补充代码&#xff0c;完成本关要求。 测试说明 输入 读取a.txt读入文本 如&#xff1a; abc abc 输出 输出文本中字母数…

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

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

华为坤灵路由器初始化的几个坑,含NAT配置

1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view [HUAWEI]aaa [HUAWEI-aaa]local-aaa-user password policy administrator [HUAWEI-aaa-lupp-admin]password complexity three-of-kinds 2、本地用户名长度必须大…

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

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

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

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

某国有投资集团用人机制改革项目成功案例纪实

——引入淘汰机制&#xff0c;优化用人机制&#xff0c;有效传导压力 【客户行业】国有企业 【问题类型】用人机制改革 【客户背景】 某集团位于北方三线城市&#xff0c;是面向工业领域的综合类国有资本投资公司&#xff0c;集团员工数千人&#xff0c;部门十余个&#xf…

[方法] 《鸣潮》/《原神》呼出与锁定光标的功能细节

本方法适用于Cinemachine - FreeLook。 1. 锁定与呼出光标的功能实现 // 锁定光标 private void LockMouse() {// 将光标锁定在屏幕中间Cursor.lockState CursorLockMode.Locked;// 隐藏光标Cursor.visible false; }// 呼出光标 private void UnLockMouse() {// 释放光标Cu…

算法家族之一——二分法

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

MyBatis使用MySQL5和MySQL8的用法

MySQL5: 添加依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency> 配置数据库&#xff1a; <!-- 配置连接数据库的信息&…