java 孩子节点所有_树的孩子-兄弟结点存储之Java实现
/**
*
本类为树(孩子-兄弟存储)的结点
*
* @version 1.0, 2008-01-24
* @author 李赫元 北京交通大学
* @since JDK1.6
*/
public class CSNode
{
/**结点的数据*/
char data;
/**第一个孩子节点的位置*/
private CSNode nextSibling;
/**下一个兄弟节点的位置*/
private CSNode firstChild;
/**
* 构造一个结点(同时设置下一个孩子节点和兄弟节点,以及当前节点的数据)
*
* @param d char 数据
* @param c CSNode 下一个孩子结点的引用
* @param s CSNode 下一兄弟结点的引用
*/
public CSNode(char d,CSNode c,CSNode s)
{
data = d;
nextSibling = s;
firstChild = c;
}
/**
* 获得第一个孩子结点
*
* @return CSNode 第一个孩子结点
*/
public CSNode getFirstChild()
{
return firstChild;
}
/**
* 获得下一个兄弟结点
*
* @return CSNode 下一个兄弟结点
*/
public CSNode getNextSibling()
{
return nextSibling;
}
/**
* 获得结点的数据
*
* @return char 结点的数据
*/
public char getData()
{
return data;
}
/**
* 设置下一个兄弟节点
*
* @param CSNode n 下一个兄弟结点
*/
public void setNextSibling(CSNode n)
{
nextSibling = n;
}
/**
* 设置第一个孩子结点
*
* @param CSNode n 第一个孩子结点
*/
public void setFirstChild(CSNode n)
{
firstChild = n;
}
/**
* 显示提示“输入子结点”,显示当前结点的数据并提示输入其孩子结点
*
*/
public void showInputChild()
{
System.out.println("请输入"+data+"的孩子结点,回车结束:");
}
}
CSTree.java
import java.util.*;
/**
*
本类实现了树(多叉)的孩子-兄弟存储
* @version 1.0, 2008-01-23
* @author 李赫元 北京交通大学
* @since JDK1.6
*/
public class CSTree
{
/**孩子-兄弟树的头结点*/
private CSNode head;
/**
* 构造函数,调用构造生成树
*
*/
public CSTree()
{
createTree();
}
/**
* 构造函数,调用构造树
*
*/
public void createTree()
{
//构造扫描器
Scanner scan = new Scanner(System.in);
scan.useDelimiter("\n");
String str = null;
LinkedList list = new LinkedList();
CSNode node = null,node1 = null;
//得到根节点的信息
System.out.println("请输入根结点的数值:");
str = scan.next();
head = node = new CSNode(str.charAt(0),null,null);
list.add(head);
//输入所有孩子结点
while(!list.isEmpty())
{
node = list.removeFirst();
node.showInputChild();
str = scan.next();
if(str.length()==0)
{
continue;
}
else
{
node1 = new CSNode(str.charAt(0),null,null);
node.setFirstChild(node1);
list.add(node1);
for(int i=1;i
{
node = node1;
node1 = new CSNode(str.charAt(i),null,null);
list.add(node1);
node.setNextSibling(node1);
}
}//else
}//while
//处理垃圾
list = null;
}//function
/**
* 查找某结点
* @param char c 要查找的结点的数据
* @return CSNode 若找到则
*/
private CSNode find(char c)
{
CSNode node = null,node1 = null;
LinkedList list = new LinkedList();
list.add(head);
while(!list.isEmpty())
{
node = list.removeFirst();
if(node!=null)
{
if(node.getData()==c)
{
return node;
}
if(node.getFirstChild()!=null)
{
list.add(node.getFirstChild());
}
if(node.getNextSibling()!=null)
{
list.add(node.getNextSibling());
}
}
}
list = null;
return null;
}
/**
* 查找某结点的双亲结点
* @param char c 要查找的结点的数据
* @return CSNode 若找到双亲结点则返回其引用,否则返回null
*/
public CSNode getParent(char c)
{
CSNode node = null,node1 = null;
LinkedList list = new LinkedList();
list.add(head);
while(!list.isEmpty())
{
node = list.removeFirst();
if(node!=null)
{
node1 = node.getFirstChild();
while(node1!=null)
{
list.add(node1);
if(node1.getData() == c)
{
return node;
}
node1 = node1.getNextSibling();
}
}//if
}//while
return null;
}//function
/**
* 查找某结点的最左孩子结点
* @param char c 要查找的结点的数据
* @return CSNode 若找到最左孩子结点则返回其引用,否则(无孩子或者无该结点)返回null
*/
public CSNode leftChild(char c)
{
CSNode node = find(c);
if(node==null)
{
System.out.println("结点"+c+"不存在.");
return null;
}
return node.getFirstChild();
}
/**
* 查找某结点的右兄弟结点
* @param char c 要查找的结点的数据
* @return CSNode 若找到最右兄弟结点则返回引用,否则(无孩子或者无该结点)返回null
*/
public CSNode rightSibling(char c)
{
CSNode node = find(c);
if(node==null)
{
System.out.println("结点"+c+"不存在.");
return null;
}
return node.getNextSibling();
}
/**
* 查找某结点的最右孩子结点
* @param char c 要查找的结点的数据
* @return CSNode 若找到最右孩子结点则返回其引用,否则(无孩子或者无该结点)返回null
*/
public CSNode rightChild(char c)
{
CSNode node = find(c);
if(node==null)
{
System.out.println("结点"+c+"不存在.");
return null;
}
node = node.getFirstChild();
while(node.getNextSibling()!=null)
{
node = node.getNextSibling();
}
return node;
}
/**
* 显示某结点的所有孩子结点(仅仅一层)
*
*/
public void printChilds(char c)
{
//找到数据为char c的结点
CSNode node = find(c);
//没找到
if(node==null)
{
System.out.println("结点" + c + "不存在.");
return ;
}
//找到了,输入其孩子结点
node = node.getFirstChild();
System.out.print(c+"的孩子结点有:");
while(node!=null)
{
System.out.print(node.getData() + " ");
node = node.getNextSibling();
}
System.out.print("\n");
}
/**
* 后根序遍历树的递归调用
*
*
*/
private void postFun(CSNode node)
{
if(node!=null)
{
if(node.getFirstChild()==null)
{
//若无孩子结点,则打印当前结点,然后遍历下一个兄弟结点
System.out.print(node.getData()+ " ");
postFun(node.getNextSibling());
}
else
{
//若右孩子结点,则先访问孩子结点,再访问自己,最后是下一个兄弟节点
postFun(node.getFirstChild());
System.out.print(node.getData()+ " ");
postFun(node.getNextSibling());
}
}
}
/**
* 后根序遍历树(调用递归)
*
*/
public void postOrderTraverse()
{
System.out.print("后根序遍历树:");
postFun(head);
System.out.println(" ");
}
/**
* 层序遍历树(非递归)
*
*/
public void leveTraverse()
{
CSNode node = head,node1 = null;
LinkedList list = new LinkedList();
list.add(node);
System.out.print("层序遍历树:");
while(!list.isEmpty())
{
node = list.remove();
while(node!=null)
{
if(node.getFirstChild()!=null)
{
list.add(node.getFirstChild());
}
System.out.print(node.getData() + " ");
node = node.getNextSibling();
}
}
System.out.print("\n");
list = null;
}
/**
* 先根序遍历树的递归调用
*
*
*/
public void preFun(CSNode node)
{
if(node!=null)
{
System.out.print(node.getData() + " ");
preFun(node.getFirstChild());
preFun(node.getNextSibling());
}
}
/**
* 先根序遍历树(递归)
*
*/
public void preOrderTraverse()
{
CSNode node = head;
System.out.print("先根序遍历树:");
preFun(head);
}
/**
* 测试函数
*
*/
public static void main(String [] args)
{
CSTree t = new CSTree();
t.printChilds('B');
System.out.println("F的双亲为:"+t.getParent('F').getData());
//System.out.println("B的左孩子结点为:"+t.leftChild('B').getData());
System.out.println("R的右孩子结点为:"+t.rightChild('R').getData());
t.postOrderTraverse();
t.leveTraverse();
t.preOrderTraverse();
}
}
java 孩子节点所有_树的孩子-兄弟结点存储之Java实现相关推荐
- java二叉树是什么_树的基本概念以及java实现二叉树
树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树. 树的基本术语有: ...
- python 生孩子朋友圈_适合生孩子发朋友圈的经典句子说说
二十. 宝贝,今天你满月了,老爸给你送上真挚祝福:祝愿宝宝一生平平安安,一世健健康康:越长越帅气,快快长大泡妞去. 五. 一月之前,突传喜讯,宝宝降临,全家欢喜,一月已满,健康快乐,平安成长,更加欣喜 ...
- python 人工智能课程对孩子的好处_学习人工智能对孩子的好处有哪些
学习人工智能对孩子的好处有哪些? 1.拓展孩子的空间联想力 昆明童程童美少儿机器人编程培训班的课程体系中包含丰富的编程机器人课程.机械人学习套装里包括品种精彩的结构零件,孩子在学习机械人的时候,自身搭 ...
- java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序
堆在逻辑上一棵完全二叉树,所以可以通过数组进行数据存储,而其余的树大多采用链式结构进行数据存储 堆分类: 大顶堆:大顶堆就是无论在任何一棵(子)树中,父节点都是最大的 小顶堆:小顶堆就是无论在任何一棵 ...
- java ee 值范围_一篇文章带你读懂: Java EE
原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...
- java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档
JAVA 集合JAVA 集合面对浩瀚的网络学习资源,您是否为很难找到适合自己的学习资源而感到苦恼过?那么,您来对地方了.在这里我们帮助大家整理了一份适于轻松学习 Java 文章的清单.JVM 文字太多 ...
- java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间
正文之前 终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事,先写写笔 ...
- java无ide编译_[转]无IDE时编译和运行Java
本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...
- java语言就业方向_四大就业方向彻底解决你学习Java语言编程的后顾之忧-生活感悟与随笔
-亦是美网络...
前面的文章中已经给大家介绍了关于Java编程语言的优势.特点以及就业前景等内容,大家之所以这么热衷于Java编程学习,不仅是因为Java是编程市场上最为广泛流行的语言,大家更关心的是学习了Java编程 ...
最新文章
- UrlUtils工具类,Java URL工具类,Java URL链接工具类
- 如何在自定义数据源组件中限制用户的更改
- Android Studio错误代码汇总
- MySQL 查询表中某字段值重复的数据
- Windows/Linux中手动添加路由
- Objects.requireNonNull 方法说明
- ssm 新建拦截器_拦截器在springboot项目和ssm架构项目的应用
- 从集合大小的定义到数学结构-解决了多年的疑惑
- C# 的基本数据类型
- 如何使用串口来给STM32下载程序
- 计算机重复文件的快捷键是,excel重复上一个操作的快捷键是什么
- 功能测试Ⅲ——缺陷及缺陷管理
- $route.matched
- 如何过滤好的和坏的价格交易信号
- 蓝牙—RFCOMM协议
- js获取html中图片路径,用js快速的获取html页面中图片的地址
- USB 协议 (三) 基础知识
- 路由控制——ACL、IP-Prefix List
- 基于Puppeteer的Chrome Recorder初试
- trx40主板支持服务器内存,华硕发布TRX40系列主板:8内存插槽设计+64个PCIe 4.0通道...