Java数据结构06——树

1.why:

数组&链表&树

 

 

2. 大纲

 

2.1前中后序

public class HeroNode {private int no;private String name;private  HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode right) {this.right = right;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +'}';}//遍历//编写前序遍历方法,被谁调用this就是谁public void preOrder(){System.out.println(this);//先输出父节点//递归先左子树前遍历if(this.left!=null){this.left.preOrder();}//递归向右子树前序遍历if (this.right!=null){this.right.preOrder();}};//编写中序遍历方法public void infixOrder(){//递归先左子树前遍历if(this.left!=null){this.left.infixOrder();}//再输出父节点System.out.println(this);//递归向右子树前序遍历if (this.right!=null){this.right.infixOrder();}};//编写后序遍历方法public void postOrder(){//递归先左子树前遍历if(this.left!=null){this.left.postOrder();}//递归向右子树前序遍历if (this.right!=null){this.right.postOrder();}//最后输出父节点System.out.println(this);};}

2.2查找节点

 //查找//前序查找public HeroNode preSearch(int HeroNo){//判断当前节点是不是if (this.getNo()==HeroNo){return this;};//左子树前序查找//如果左递归前序查找节点,找到结点,则返回HeroNode resNode = null;//辅助节点if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不为空才返回,因为右子树仍未查找if (resNode!=null){return resNode;}if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}return resNode;}//中序查找public HeroNode infixSearch(int HeroNo){//左子树前序查找//如果左递归前序查找节点,找到结点,则返回HeroNode resNode = null;//辅助节点if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不为空才返回,因为右子树仍未查找if (resNode!=null){return resNode;};//判断当前节点是不是if (this.getNo()==HeroNo){return this;}//查找右子树if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}return resNode;}//后序查找public HeroNode postSearch(int HeroNo){//左子树前序查找//如果左递归前序查找节点,找到结点,则返回HeroNode resNode = null;//辅助节点if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不为空才返回,因为右子树仍未查找if (resNode!=null){return resNode;};if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}if (resNode!=null){return resNode;};//最后判断当前节点是不是if (this.getNo()==HeroNo){return this;};return resNode;}

2.3删除节点(基本) 

//删除public void deleteNode(int HeroNo){//判断左子节点if (this.left!=null && this.left.getNo()==HeroNo){this.left=null;return;}//判断右子节点if (this.right!=null&&this.right.getNo()==HeroNo){this.right=null;return;}//遍历左子树if (this.left!=null){this.left.deleteNode(HeroNo);}if(this.right!=null){this.right.deleteNode(HeroNo);}}

2.4二叉树 (root节点)

public class BinaryTree {//rootprivate HeroNode root;public void setRoot(HeroNode root) {this.root = root;};//遍历二叉树//前序遍历public void preOrder(){if (this.root!=null){this.root.preOrder();}else {System.out.println("二叉树为空");}}//中序遍历public void infixOrder(){if (this.root!=null){this.root.infixOrder();}else {System.out.println("二叉树为空");}}//后续遍历public void postOrder(){if (this.root!=null){this.root.postOrder();}else {System.out.println("二叉树为空");}}//查找二叉树指定节点//前序查找public HeroNode preSearch(int HeroNo){if (this.root!=null){return this.root.preSearch(HeroNo);}else {return null;}}//中序查找public HeroNode infixSearch(int HeroNo){if (this.root!=null){return this.root.infixSearch(HeroNo);}else {return null;}}//后序查找public HeroNode postSearch(int HeroNo){if (this.root!=null){return this.root.postSearch(HeroNo);}else {return null;}}public void delNode(int HeroNo){if(root!=null){if (root.getNo()==HeroNo){root=null;}else {root.deleteNode(HeroNo);}}else {System.out.println("空树,无法删除");}}
}

2.5顺序存储二叉树  (为完全二叉树,公式

public class ArrBinaryTree {private int [] arr;//存储结点的数组public ArrBinaryTree(int[] arr) {this.arr = arr;}//重载public void preOrder(){preOrder(0);}public void infixOrder(){infixOrder(0);}/**** @param index  arr[index]=i*///前序public void preOrder(int index){if(arr == null ||arr.length==0){System.out.println("数组为空");}System.out.println(arr[index]);//向左递归遍历if ((index*2+1)<arr.length){preOrder(2*index+1);}//向右递归遍历if ((index*2+2)<arr.length){preOrder(2* index+2);}}//中序public void infixOrder(int index){if(arr == null ||arr.length==0){System.out.println("数组为空");}//向左递归遍历if ((index*2+1)<arr.length){infixOrder(index*2+1);}System.out.println(arr[index]);//向右递归遍历if ((index*2+2)<arr.length){infixOrder(2* index+2);}}
}

 2.6线索化二叉树(节点左右节点类型、前驱指针

 

 

public class ThreadBinaryTree {private HeroNode root;//为了实现线索化,需要创建要给指向当前结点的前驱结点的指针// 在递归进行线索化时,pre总是保留前一个结点//pre指针private HeroNode pre =null;public HeroNode getRoot() {return root;}public HeroNode getPre() {return pre;}public void setPre(HeroNode pre) {this.pre = pre;}public void setRoot(HeroNode root) {this.root = root;};//重载threadNodes()public void threadedNodes(){this.threadedNodes(root);}/*多回顾*/
//    //中序线索化二叉树public void threadedNodes(HeroNode node){//递归找到最左节点,然后返回if (node == null) {return;}//先线索化左子树threadedNodes(node.getLeft());//线索化当前节点if (node.getLeft()==null){node.setLeft(pre);node.setLeftType(1);}//key!!!if (pre!=null&&pre.getRight()==null){pre.setRight(node);pre.setRightType(1);}pre=node;//线索化右子树threadedNodes(node.getRight());};//***提高:中序、后序***//遍历线索化二叉树public void threadedList(){HeroNode node = root;while (root!=null){while(node!=null){//循环的找到leftType ==1的结点,第一个找到就是8结点// 后面随着遍历而变化,因为当leftType==1时,说明该结点是按照线索化// 处理后的有效结点while (node.getLeftType()==0){node=node.getLeft();}System.out.println(node);while (node.getRightType()==1){node=node.getRight();System.out.println(node);}//替换这个遍历点(对于原本就有右结点的)!!!node=node.getRight();}}}//遍历二叉树//前序遍历public void preOrder(){if (this.root!=null){this.root.preOrder();}else {System.out.println("二叉树为空");}}//中序遍历public void infixOrder(){if (this.root!=null){this.root.infixOrder();}else {System.out.println("二叉树为空");}}//后续遍历public void postOrder(){if (this.root!=null){this.root.postOrder();}else {System.out.println("二叉树为空");}}//查找二叉树指定节点//前序查找public HeroNode preSearch(int HeroNo){if (this.root!=null){return this.root.preSearch(HeroNo);}else {return null;}}//中序查找public HeroNode infixSearch(int HeroNo){if (this.root!=null){return this.root.infixSearch(HeroNo);}else {return null;}}//后序查找public HeroNode postSearch(int HeroNo){if (this.root!=null){return this.root.postSearch(HeroNo);}else {return null;}}public void delNode(int HeroNo){if(root!=null){if (root.getNo()==HeroNo){root=null;}else {root.deleteNode(HeroNo);}}else {System.out.println("空树,无法删除");}}
}

 

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

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

相关文章

Ubuntu编译文件安装SNMP服务

net-snmp源码下载 http://www.net-snmp.org/download.html 编译步骤 指定参数编译 ./configure --prefix/root/snmpd --with-default-snmp-version"2" --with-logfile"/var/log/snmpd.log" --with-persistent-directory"/var/net-snmp" --wi…

MinIO集群模式信息泄露漏洞(CVE-2023-28432)

前言&#xff1a;MinIO是一个用Golang开发的基于Apache License v2.0开源协议的对象存储服务。虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。该漏洞会在前台泄露用户的账户和密码。 0x00 环境配置 …

html、css类名命名思路整理

开发页面时&#xff0c;老是遇到起名问题&#xff0c;越想越头疼&#xff0c;严重影响开发进度&#xff0c;都是在想名字&#xff0c;现在做一下梳理&#xff0c;统一一下思想&#xff0c;希望以后能减少这块的痛苦。 命名规则 [功能名称]__[组成部分名称]--[样式名称] 思路…

空间运算设备-Apple Vision Pro

苹果以其在科技领域的创新而闻名&#xff0c;他们致力于推动技术的边界&#xff0c;这在他们的产品中表现得非常明显。他们尝试开发一项的新型突破性显示技术。在 2023 年 6 月 5 日官网宣布将发布 Apple Vision Pro 头戴空间设备&#xff0c;我们一起来了解一下 Apple Vision …

SVPWM原理及simulink

关注微♥“电击小子程高兴的MATLAB小屋”获得专属优惠 一.SVPWM原理 SPWM常用于变频调速控制系统&#xff0c;经典的SPWM控制主要目的是使变频器的输出电压尽量接近正弦波&#xff0c;并未关注输出的电流波形。而矢量控制的最终目的是得到圆形的旋转磁场&#xff0c;这样就要求…

根据图片生成前端代码:GPT vesion 助你释放效能 | 开源日报 No.98

php/php-src Stars: 36.4k License: NOASSERTION PHP 是一种流行的通用脚本语言&#xff0c;特别适合 Web 开发。快速、灵活和实用&#xff0c;PHP 支持从博客到世界上最受欢迎的网站等各种应用。PHP 遵循 PHP 许可证 v3.01 发布。 主要功能&#xff1a; 提供强大而灵活的脚…

代码随想录算法训练营 ---第五十六天

今天同样是 动态规划&#xff1a;编辑距离问题&#xff01; 第一题&#xff1a; 简介&#xff1a; 本题有两个思路&#xff1a; 1.求出最长公共子串&#xff0c;然后返还 word1.length()word2.length()-2*dp[word1.size()][word2.size()] 本思路解法与求最长公共子串相同&…

Mybatis XML改查操作(结合上文)

"改"操作 先在UserInfoXMLMapper.xml 中 : <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><map…

主窗体、QFile、编码转换、事件、禁止输入特殊字符

主窗体 部件构成 菜单栏、工具栏、主窗体、状态栏。 UI 编辑器设计主窗体 &#x1f4a1; 简易记事本的实现&#xff08;part 1&#xff09; 菜单栏 工具栏&#xff08;图标&#xff09; 主窗体 完善菜单栏&#xff1a; mainwindow.cpp #include "mainwindow.h"…

java8 常用code

文章目录 前言一、lambda1. 排序1.1 按照对象属性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 数据库排序jpa 2. 聚合2.1 基本聚合&#xff08;返回对象list&#xff09;2.2 多字段组合聚合&#xff08;直接返回对象list数量&#xff09; 二、基础语法2.1 List2.1.1 数…

Holynix

信息收集阶段 存活主机探测&#xff1a;arp-scan -l 当然了&#xff0c;正常来说我们不应该使用arp进行探测&#xff0c;arp探测的是arp的缓存表&#xff0c;我们应该利用nmap进行探测&#xff01; nmap -sT --min-rate 10000 192.168.182.0/24 端口探测 nmap -sT --min-rat…

Navicat 技术指引 | 适用于 GaussDB 分布式的调试器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

【数据结构】单调栈与单调队列算法总结

单调栈 知识概览 单调栈最常见的应用是找到每一个数离它最近的且比它小的数。单调栈考虑的方式和双指针类似&#xff0c;都是先想一下暴力做法是什么&#xff0c;然后再挖掘一些性质如单调性&#xff0c;最终可以把目光集中在比较少的状态中&#xff0c;从而达到降低时间复杂…

JS中call()、apply()、bind()改变this指向的原理

大家如果想了解改变this指向的方法&#xff0c;大家可以阅读本人的这篇改变this指向的六种方法 大家有没有想过这三种方法是如何改变this指向的&#xff1f;我们可以自己写吗&#xff1f; 答案是&#xff1a;可以自己写的 让我为大家介绍一下吧&#xff01; 1.call()方法的原理…

[mysql]linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

C#-快速剖析文件和流,并使用

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …

枚举 LeetCode2048. 下一个更大的数值平衡数

如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 如果n的位数是k&#xff0c;n它的下一个大的平衡数一定不会超过 k1个k1…

使用git出现的问题

保证 首先保证自己的git已经下载 其次保证自己的gitee账号已经安装并且已经生成ssh公钥 保证自己要push的代码在要上传的文件夹内并且配置文件等都在父文件夹&#xff08;也就是文件没有套着文件&#xff09; 问题 1 $ git push origin master gitgitee.com: Permission de…

近似同态加密的 IND/SIM-CPA+ 安全性:对于 CKKS 实际有效的攻击

参考文献&#xff1a; [LM21] Li B, Micciancio D. On the security of homomorphic encryption on approximate numbers[C]//Advances in Cryptology–EUROCRYPT 2021: 40th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Z…

【Linux】命令expect使用详解

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…