1. package tree;
  2.  
  3. import java.util.List;
  4. import java.util.ArrayList;
  5. import java.io.Serializable;
  6.  
  7. public class TreeNode implements Serializable {
  8. private int parentId;
  9. private int selfId;
  10. protected String nodeName;
  11. protected Object obj;
  12. protected TreeNode parentNode;
  13. protected List<TreeNode> childList;
  14.  
  15. public TreeNode() {
  16. initChildList();
  17. }
  18.  
  19. public TreeNode(TreeNode parentNode) {
  20. this.getParentNode();
  21. initChildList();
  22. }
  23.  
  24. public boolean isLeaf() {
  25. if (childList == null) {
  26. return true;
  27. } else {
  28. if (childList.isEmpty()) {
  29. return true;
  30. } else {
  31. return false;
  32. }
  33. }
  34. }
  35.  
  36. /* 插入一个child节点到当前节点中 */
  37. public void addChildNode(TreeNode treeNode) {
  38. initChildList();
  39. childList.add(treeNode);
  40. }
  41.  
  42. public void initChildList() {
  43. if (childList == null)
  44. childList = new ArrayList<TreeNode>();
  45. }
  46.  
  47. public boolean isValidTree() {
  48. return true;
  49. }
  50.  
  51. /* 返回当前节点的父辈节点集合 */
  52. public List<TreeNode> getElders() {
  53. List<TreeNode> elderList = new ArrayList<TreeNode>();
  54. TreeNode parentNode = this.getParentNode();
  55. if (parentNode == null) {
  56. return elderList;
  57. } else {
  58. elderList.add(parentNode);
  59. elderList.addAll(parentNode.getElders());
  60. return elderList;
  61. }
  62. }
  63.  
  64. /* 返回当前节点的晚辈集合 */
  65. public List<TreeNode> getJuniors() {
  66. List<TreeNode> juniorList = new ArrayList<TreeNode>();
  67. List<TreeNode> childList = this.getChildList();
  68. if (childList == null) {
  69. return juniorList;
  70. } else {
  71. int childNumber = childList.size();
  72. for (int i = 0; i < childNumber; i++) {
  73. TreeNode junior = childList.get(i);
  74. juniorList.add(junior);
  75. juniorList.addAll(junior.getJuniors());
  76. }
  77. return juniorList;
  78. }
  79. }
  80.  
  81. /* 返回当前节点的孩子集合 */
  82. public List<TreeNode> getChildList() {
  83. return childList;
  84. }
  85.  
  86. /* 删除节点和它下面的晚辈 */
  87. public void deleteNode() {
  88. TreeNode parentNode = this.getParentNode();
  89. int id = this.getSelfId();
  90.  
  91. if (parentNode != null) {
  92. parentNode.deleteChildNode(id);
  93. }
  94. }
  95.  
  96. /* 删除当前节点的某个子节点 */
  97. public void deleteChildNode(int childId) {
  98. List<TreeNode> childList = this.getChildList();
  99. int childNumber = childList.size();
  100. for (int i = 0; i < childNumber; i++) {
  101. TreeNode child = childList.get(i);
  102. if (child.getSelfId() == childId) {
  103. childList.remove(i);
  104. return;
  105. }
  106. }
  107. }
  108.  
  109. /* 动态的插入一个新的节点到当前树中 */
  110. public boolean insertJuniorNode(TreeNode treeNode) {
  111. int juniorParentId = treeNode.getParentId();
  112. if (this.parentId == juniorParentId) {
  113. addChildNode(treeNode);
  114. return true;
  115. } else {
  116. List<TreeNode> childList = this.getChildList();
  117. int childNumber = childList.size();
  118. boolean insertFlag;
  119.  
  120. for (int i = 0; i < childNumber; i++) {
  121. TreeNode childNode = childList.get(i);
  122. insertFlag = childNode.insertJuniorNode(treeNode);
  123. if (insertFlag == true)
  124. return true;
  125. }
  126. return false;
  127. }
  128. }
  129.  
  130. /* 找到一颗树中某个节点 */
  131. public TreeNode findTreeNodeById(int id) {
  132. if (this.selfId == id)
  133. return this;
  134. if (childList.isEmpty() || childList == null) {
  135. return null;
  136. } else {
  137. int childNumber = childList.size();
  138. for (int i = 0; i < childNumber; i++) {
  139. TreeNode child = childList.get(i);
  140. TreeNode resultNode = child.findTreeNodeById(id);
  141. if (resultNode != null) {
  142. return resultNode;
  143. }
  144. }
  145. return null;
  146. }
  147. }
  148.  
  149. /* 遍历一棵树,层次遍历 */
  150. public void traverse() {
  151. if (selfId < 0)
  152. return;
  153. print(this.selfId);
  154. if (childList == null || childList.isEmpty())
  155. return;
  156. int childNumber = childList.size();
  157. for (int i = 0; i < childNumber; i++) {
  158. TreeNode child = childList.get(i);
  159. child.traverse();
  160. }
  161. }
  162.  
  163. public void print(String content) {
  164. System.out.println(content);
  165. }
  166.  
  167. public void print(int content) {
  168. System.out.println(String.valueOf(content));
  169. }
  170.  
  171. public void setChildList(List<TreeNode> childList) {
  172. this.childList = childList;
  173. }
  174.  
  175. public int getParentId() {
  176. return parentId;
  177. }
  178.  
  179. public void setParentId(int parentId) {
  180. this.parentId = parentId;
  181. }
  182.  
  183. public int getSelfId() {
  184. return selfId;
  185. }
  186.  
  187. public void setSelfId(int selfId) {
  188. this.selfId = selfId;
  189. }
  190.  
  191. public TreeNode getParentNode() {
  192. return parentNode;
  193. }
  194.  
  195. public void setParentNode(TreeNode parentNode) {
  196. this.parentNode = parentNode;
  197. }
  198.  
  199. public String getNodeName() {
  200. return nodeName;
  201. }
  202.  
  203. public void setNodeName(String nodeName) {
  204. this.nodeName = nodeName;
  205. }
  206.  
  207. public Object getObj() {
  208. return obj;
  209. }
  210.  
  211. public void setObj(Object obj) {
  212. this.obj = obj;
  213. }
  214. }

java实现多叉树查找的更多相关文章

  1. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  2. Java学习之二分查找算法

    好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...

  3. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  4. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  5. Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)

    一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...

  6. java 正则表达式例子, 查找字符串

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class Main { public static voi ...

  7. Java连接数据库完整代码 查找和插入

    package test; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; ...

  8. Java网络编程之查找Internet地址

    一.概述 连接到Internet上计算机都有一个称为Internet地址或IP地址的唯一的数来标识.由于IP很难记住,人们设计了域名系统(DNS),DNS可以将人们可以记忆的主机名与计算机可以记忆的I ...

  9. java数组回顾---线性查找最大值最小值---二分查找

    import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...

随机推荐

  1. Java经典案例之-判断质数(素数)

    /** * 描述:任意输入两个数n,m(n<m)判断n-m之间有多少个素数,并输出所有素数. * 分析:素数即质数,除1和本身之外,不能被其他自然数整除的数. * 判断素数的方法为:用一个数分别 ...

  2. Delphi的时间与字符串函数代码示例

    [delphi] view plaincopyprint? SysUtils.StrToDate(); SysUtils.StrToDateDef(); SysUtils.TryStrToDate() ...

  3. delphi字符串操作函数一览

    首部 function SameText(const S1, S2: string): Boolean; $[SysUtils.pas 功能 返回两个字符串是否相等 说明 不区分大小写 参考 < ...

  4. 多线程和多进程的区别(C++)

    很想写点关于多进程和多线程的东西,我确实很爱他们.但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手. 今天终于下了决心,写点东西,以后可以再修修补补也无妨. 一.为何需要多进程(或者 ...

  5. Flex4 布局 元素index

    Flex4 布局 元素index <?xml version="1.0" encoding="utf-8"?> <s:Application ...

  6. 安装使用GYP,并编译libpomelo2

    1.然后是下载GYP,它是由 Chromium 团队开发的跨平台自动化项目构建工具,安装后可以使用其构建出libpomelo的vs工程项目,再而进行编译,这步先下载,地址: http://code.g ...

  7. win7下安装sdks

    原文及更多内容:http://yysource.sourceforge.net/?p=103 下载和安装 Windows 调试工具 http://msdn.microsoft.com/zh-CN/wi ...

  8. 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN

    在 /home/your_name/TensorFlow/DCGAN/ 下新建文件 train.py,同时新建文件夹 logs 和文件夹 samples,前者用来保存训练过程中的日志和模型,后者用来保 ...

  9. json-lib之复杂数据类型的转换

    在json字符串转java bean时,一般的对象,可以直接转,如:一个学生类,属性有姓名.年龄等 public class Student{ private String sname; privat ...

  10. “权限系统_基于HUI”的简单介绍和交流

    昂,最近比较闲,写了个权限系统. 后端框架还是老样子,基于本人自己搭建的后台基础开发框架"Spring_Mvc_EF":前端框架,我挑选了一阵子,最后选用了HUI前端开发框架,因为 ...