双亲表示法构造树-----Java实现

news/2026/1/25 17:51:17/文章来源:https://www.cnblogs.com/tww103/p/19530200

package Data_Structure.Tree;

import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Scanner;

//双亲表示法构造树,该树使用层序进行构造,通过parent下标索引双亲结点
public class ParentTree{
private static final int CAPACITY=100;
private Node nodes[];
private final int root;
private int length;

static class Node{private char data;private int parent;public Node(char data,int parent) {this.parent = parent;this.data = data;}public char getData(){return data;}public void setData(char val){this.data = val;}public int getParent(){return parent;}public void setParent(int index){}
}//构造函数,给数组分配内存
public ParentTree(){nodes  = new Node[CAPACITY];root=0;length=0;
}//构造树结构, 输入时,按照层序排序输入
public void createTree(int n) throws IOException {if(n<=0||n>CAPACITY)throw new IllegalArgumentException("非法参数:"+ n);Scanner in =new Scanner(System.in);System.out.println("请先输入根结点元素:");nodes[0] = new Node(in.next().charAt(0),-1); //根结点没有双亲结点clearCacheArea(); //清空缓存区length++;System.out.println("输入子结点以及对应双亲结点的索引\n字符与数字输入完后回车再输入下一对");for(int i=1;i<n;i++){nodes[i] = new Node((char)System.in.read(),in.nextInt());clearCacheArea();length++;}
}//根据传入数组构造树
public void createTree(int n,char[] data,int[] parents){if(n>CAPACITY || n<=0 || data.length!= parents.length && data.length!=n)throw new IllegalArgumentException("非法参数");for(int i=0;i<n;i++){nodes[i] = new Node(data[i],parents[i]);length++;}
}public void show(){if(length<=0)throw new NoSuchElementException("无元素");for(int i=0;i<length;i++){System.out.println(nodes[i].data+": 双亲结点 "+ nodes[i].parent);}
}//清空输入缓存区
public static void clearCacheArea() throws IOException {while (System.in.available() > 0) {System.in.read();}
}// 清空该树
public void clearTree(){nodes=new Node[CAPACITY]; //分配新的内存length=0;}//判断树是否为空
public boolean treeEmpty(){return this.length == 0;
}//返回T的根结点元素
public char root(){return nodes[0].data;
}//返回树的结点数
public int getLength()
{return this.length;
}// 返回树的深度
public int treeDepth(){if(length==0)return 0;int depth=0;/*我设计让nodes[0]始终存储的为根结点所以,从下往上遍历即从数组最后一个元素往前找* *///从叶子结点往上遍历for(int i=length-1;i>=0;i--){int curDepth=0;int cursor =i; // 游标,根据当前节点的parent往上爬while(cursor!=-1){ // 如果游标不等于根结点cursor = nodes[cursor].getParent(); //就记录当前游标结点的双亲结点索引,往上爬curDepth++; //深度+1}if(curDepth>depth)depth = curDepth;}return depth;
}//返回指定结点的值
public char value(int index){if(index <0 ||index>=getLength())throw new ArrayIndexOutOfBoundsException(index +"out bound");return nodes[index].getData();
}// 赋予指定结点新值 ,并返回旧的值
public char assign(int index ,char val){if(index <0 ||index>=getLength())throw new ArrayIndexOutOfBoundsException(index +"out bound");char oldValue = nodes[index].getData();nodes[index].setData(val);return oldValue;
}//返回指定索引的双亲结点的元素
public char parent(int index ){if(index <0 ||index>=getLength())throw new ArrayIndexOutOfBoundsException(index +"out bound");if(index==0)throw new NoSuchElementException("根结点没有双亲");return nodes[nodes[index].getParent()].getData();
}// 返回指定索引的最左孩子结点data域
public char leftChild(int index){if(index<0 ||index >=length)throw new ArrayIndexOutOfBoundsException(index+"使数组溢出");//从最头开始找/*条件为,该结点的双亲结点索引 == index* 并且是第一个* */for(int i=0;i<length;i++){if(nodes[i].getParent()==index)return nodes[i].getData();}//循环结束就代表没找到,返回-return ' ';
}// 返回指定索引的最右孩子结点data域
public char rightChild(int index){if(index<0 ||index >=length)throw new ArrayIndexOutOfBoundsException(index+"使数组溢出");//从最尾开始找/*条件为,该结点的双亲结点索引 == index* 并且是第一个* */for(int i=length-1;i>=0;i--){if(nodes[i].getParent()==index)return nodes[i].getData();}//循环结束就代表没找到,返回-return ' ';
}// 双亲表示符实现插入和删除比较复杂,且不符合设计理论,双亲表示法适合需大量查询父节点的场景
// 且双亲表示法本身就是用静态数组表示,若你插入后,移动了数组,parent将全部失效,需要考虑的地方很多public static void main(String[] args) throws IOException {ParentTree tree = new ParentTree();//测试时的数据char[] data = {'R','A','B','C','D','E','F','G','H','K'};int[] parents = {-1,0,0,0,1,1,3,6,6,6};tree.createTree(10,data,parents);tree.show();System.out.println("tree的结点数为:"+ tree.getLength());System.out.println("tree的深度为:" + tree.treeDepth());System.out.println("tree的根结点为:"+tree.root());System.out.println("tree位于"+5+"索引的数据为"+tree.value(5));char val =  'O';System.out.println("为索引"+6+"的结点赋新值,它的旧值为:"+tree.assign(6,val));tree.show();System.out.println("索引1的双亲结点元素为"+tree.parent(1));System.out.println("索引为1的结点的左孩子为 "+tree.leftChild(1));System.out.println("索引为1的结点的右孩子为 "+tree.rightChild(1));System.out.println("索引为2的结点的右孩子为 "+tree.rightChild(2));}

}

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

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

相关文章

KiCad V10新特性前瞻

https://forum.kicad.info/t/post-v9-new-features-and-development-news/58848 KiCad采用年度发布周期&#xff0c;主版本通常在每年2月至3月间发布。虽然正式版尚未推出&#xff0c;但由于KiCad始终秉持开源理念&#xff08;这恰是其最大优势&#xff09;&#xff0c;开发者…

基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析

一、核心结论 传统材料力学势能法是计算健康齿轮时变啮合刚度的经典方法&#xff0c;通过将轮齿简化为变截面悬臂梁&#xff0c;考虑弯曲、剪切、轴向压缩、赫兹接触及基体变形等能量分量&#xff0c;能够准确反映齿轮啮合过程中的刚度变化。该方法具有计算效率高、精度满足工…

电气设计的隐藏外挂:1:1元器件图库实战

电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小型号都有&#xff0c;应有尽有&#xff0c;全部1:1尺寸&#xff0c;直接标注就OK配电柜设计现场最要命的场景&#xff1a;左手抓着某厂家的断路器样本…

Product Hunt 每日热榜 | 2026-01-25

1. Humans in the Loop 标语&#xff1a;一个免费的社区&#xff0c;专门讨论与代理编程与人工智能相关的所有事。 介绍&#xff1a;“有人的参与”是一个为热爱利用人工智能加速工作的伙伴们打造的地方。这里是一个免费的社区&#xff0c;大家可以在这里分享关于Claude Code…

构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步

一、引言&#xff1a;从单设备到分布式协同 OpenHarmony 的核心愿景之一是 “超级终端” —— 多个物理设备无缝协同&#xff0c;形成一个逻辑上的统一工作空间。例如&#xff1a; 在手机上开始编辑文档&#xff0c;走到平板前自动续写&#xff1b;车机导航途中&#xff0c;到家…

构建 OpenHarmony 智能场景自动化配置面板:Flutter 实现可视化规则编排

一、引言&#xff1a;从手动操作到场景自动化 在 OpenHarmony 驱动的全场景智慧生态中&#xff0c;用户不再满足于“打开 App 控制设备”&#xff0c;而是期望系统能主动理解意图、自动执行操作。例如&#xff1a; “如果我到家&#xff0c;就打开客厅灯和空调”&#xff1b;…

Simulink双Y-30度六相感应电机模型,matlab18B版本。 六相交流供电

Simulink双Y-30度六相感应电机模型&#xff0c;matlab18B版本。 六相交流供电&#xff0c;做六相电机容错、多自由度控制以及本体设计的同学能用得上&#xff0c;六相感应电机模型电机工作原理参考文献等相关资料 最近在实验室折腾六相感应电机控制&#xff0c;发现Matlab 201…

强烈安利8个一键生成论文工具,继续教育学生论文写作必备!

强烈安利8个一键生成论文工具&#xff0c;继续教育学生论文写作必备&#xff01; AI 工具如何助力论文写作&#xff0c;提升效率与质量 在当前的学术环境中&#xff0c;AI 工具已经成为越来越多继续教育学生的重要助手。尤其是在论文写作过程中&#xff0c;这些工具不仅能够显…

ubuntu_server安装教程

准备文件: ubuntu-live-server-amd64.iso ventoy-1.1.10-windows.zip系统启动盘制作 网盘下载: https://pan.quark.cn/s/a804ae8dd78f 准备4G以上U盘,会清空u盘数据,尽量备份数据 1.不能用rufus制作系统启动盘,否…

基于深度学习的 pcb 缺陷检测系统

目录 深度学习在PCB缺陷检测中的应用典型系统架构设计关键技术实现要点性能优化方向工业部署注意事项 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 深度学习在PCB缺陷检测中的应用 深度学习技术在PCB缺陷检测中展现出显著优势&…

2025年市面上热门的自动化立体库制造企业怎么选,轻型货架/隔板货架/仓储货架/中型货架,自动化立体库供应厂家哪家强

行业洞察:自动化立体库的“选型战”如何破局? 随着制造业智能化转型加速,自动化立体库已成为企业提升仓储效率、降低运营成本的核心基础设施。据统计,2024年国内自动化立体库市场规模突破320亿元,年复合增长率达1…

基于单片机的汽车倒车雷达超声波测距系统设计

目录系统概述硬件设计软件设计工作流程优化方向源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 基于单片机的汽车倒车雷达超声波测距系统通过超声波传感器发射和接收信号&#xff0c;结合单片机处理数据并计算距离&#xff0c…

JWT 解码工具

JWT 解码工具页面index.html脚本运行效果如下&#xff1a;页面index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

基于深度学习的电动车头盔检测系统

目录 电动车头盔检测系统的背景与需求核心技术框架关键实现步骤性能优化方向典型应用场景挑战与解决方案 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 电动车头盔检测系统的背景与需求 电动车头盔检测系统通过计算机视觉技术自动识…

keycloak测试11.0.2 for windows

keycloak测试11.0.2PasswordClient credentialsIntrospectionAuthorization codePassword 应用于后端处理: set KEYCLOAK_HOSThttp://keycloak.demofor.com.cn/ set KEYCLOAK_REALMkeycloak-learn set CLIENT_IDchapter-1 set CLIENT_SECRET149240f3-31c6-46dc-bab4-0b53c0ee1…

基于深度学习的番茄检测系统

目录 深度学习番茄检测系统概述核心功能与技术系统架构示例性能优化方向应用案例 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 深度学习番茄检测系统概述 深度学习番茄检测系统利用计算机视觉和深度学习技术&#xff0c;自动识别、…

基于深度学习的肺部病变检测系统

目录 深度学习在肺部病变检测中的应用系统核心组件关键技术优势典型应用场景挑战与改进方向 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 深度学习在肺部病变检测中的应用 深度学习技术通过卷积神经网络&#xff08;CNN&#xff09…

得到节点Device (P2P0)的子节点Device (S1F0)的PCI地址

得到节点Device (P2P0)的子节点Device (S1F0)的PCI地址第0部分&#xff1a;dsdt.dsl:6096: Device (P2P0) dsdt.dsl:6306: Device (S1F0)Device (S1F0){Name (_ADR, Zero) // _ADR: AddressName (_SUN, 0x20) // _SUN: Slot User NumberOperationR…

导师严选2026继续教育一键生成论文工具TOP9:学术写作全维度测评

导师严选2026继续教育一键生成论文工具TOP9&#xff1a;学术写作全维度测评 2026年继续教育论文工具测评&#xff1a;精准筛选&#xff0c;助力高效写作 在继续教育领域&#xff0c;论文写作已成为许多学员必须面对的挑战。无论是课程结业、职称评审还是学术深造&#xff0c;…

开源DTU全套方案详解:原理图设计、PCB布局、BOM清单、上位机源码及Keil嵌入式源码集成

开源DTU全套方案 原理图PCB BOM清单 上位机源码 keil嵌入式源码最近在折腾工业物联网网关设备&#xff0c;发现市面上的DTU价格从几百到上万不等。作为野生电子工程师&#xff0c;这能忍&#xff1f;果断翻出吃灰的立创EDA&#xff0c;撸起袖子自己干。今天就把这套开源DTU方案…