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.hqwc.cn/news/259876.html

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

相关文章

C/C++端口复用SO_REUSEADDR(setsockopt参数),test ok

端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用&#xff0c;则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用&#xff0c;绑定会失败&#xff0c;提示ADDR已经在使用中——…

Navicat 技术指引 | 适用于 GaussDB 分布式的日志查询与配置设置

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

[笔记]ARMv7/ARMv8 交叉编译器下载

开发 Cortex-A7、Cortex-A72 或其他 ARM 架构 profile 芯片时&#xff0c;经常需要下载对应架构的交叉编译器&#xff0c;所以写这篇笔记&#xff0c;用于记录一下交叉编译器下载流程&#xff0c;免得搞忘。 编译环境&#xff1a;ubuntu 虚拟机 下载地址 我们可以从 ARM 官网…

深入浅出:HTTPS单向与双向认证及证书解析20231208

介绍: 网络安全的核心之一是了解和实施HTTPS认证。本文将探讨HTTPS单向认证和双向认证的区别&#xff0c;以及SSL证书和CA证书在这些过程中的作用&#xff0c;并通过Nginx配置实例具体说明。 第一部分&#xff1a;HTTPS单向认证 定义及工作原理&#xff1a;HTTPS单向认证是一…

C语言WFC实现绘制贝塞尔曲线的函数

前言&#xff1a; 贝塞尔曲线于 1962 年&#xff0c;由法国工程师皮埃尔贝济埃&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计,贝塞尔曲线最初由保尔德卡斯特里奥于1959年运用德卡斯特里奥算法开发&#xff0c;以稳定数值…

RTL编码(3)——语句优化与布线优化

目录 一、语句优化 1.1 if与case 1.1.1 条件语句避免出现锁存器 1.1.2 if与case语句综合效果的差异 1.2 阻塞赋值与非阻塞赋值 1.3 算法改进 1.3.1 算法改进提升速度 1.3.2 算法改进缩小面积 二、布线优化 2.1 热点 2.2 瓶颈 2.3 广播 三、总结 一、语句优化 1…

STM32的BKP与RTC简介

芯片的供电引脚 引脚表橙色的是芯片的供电引脚&#xff0c;其中VSS/VDD是芯片内部数字部分的供电&#xff0c;VSSA/VDDA是芯片内部模拟部分的供电&#xff0c;这4组以VDD开头的供电都是系统的主电源&#xff0c;正常使用时&#xff0c;全部都要接3.3V的电源上&#xff0c;VBAT是…

这是最后的战役了

不变因子 初等因子 行列式因子 smith标准型 酉矩阵 H-阵等等 A H A A^H A AHA 就是 H-阵 正定H阵的性质 若 A A A 为正定的H-阵. 存在可逆矩阵 Q Q Q&#xff0c; 使得 A Q H Q AQ^H Q AQHQ.存在 P P P, 使得 P H A P I P^HAPI PHAPI.A的特征值大于0. Q − 1 A Q Q^{…

springboot3远程调用

RPC 两个服务器之间的调用 远程请求 内部服务之间的调用 可以通过 cloud 注册中心 openfeign等 外部服务的调用 http请求 外部协议 api:远程接口 sdk&#xff1a;本地调用 调用阿里云的天气请求

T5论文个人记录

参考&转载自&#xff1a; 介绍Google推出的大一统模型—T5_谷歌大模型_深度之眼的博客-CSDN博客 T5 和 mT5-CSDN博客 T5&#xff1a;Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer&#xff08;万字长文略解T5&#xff09;_t5论文…

关于前端原生技术-Jsonp的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134777717 出自【进步*于辰的博客】 在学习了Jsoup这个知识点之后&#xff0c;发觉js的这一特点…

易错C语言选择题

1.void main() {int a2,b5; printf("a%%d,b%%d\n"); } 结果为&#xff1a;&#xff08;&#xff09; A. a%2&#xff0c;b%5 B. a2&#xff0c;b5 C. a%%d&#xff0c;b%%d D. a%d&#xff0c;b%d 答案&#xff1a;D 2.若有说明&#x…