树的表示方法很多,双亲儿子,双亲,儿子,儿子兄弟表示法。

但是用来表示树的最多的方式是儿子兄弟表示法。

第一,可以用来表示孩子节点不相同的树。

第二,不浪费存储空间。

一下贴出代码:

===============================节点类=================================

package sonBrotherTree;

public class TreeNode {

private TreeNode sonNode;//这里存储的是最左的儿子节点

private TreeNode brotherNode;//这里存储的是自己的兄弟节点

private int value;

public TreeNode(TreeNode sonNode,TreeNode brotherNode,int value){

this.sonNode = sonNode;

this.brotherNode = brotherNode;

this.value = value;

}

public TreeNode getSonNode(){

return this.sonNode;

}

public TreeNode getBrotherNode() {

return brotherNode;

}

public int getValue(){

return value;

}

public void setSonNode(TreeNode sonNode){

this.sonNode = sonNode;

}

public void setBrotherNode(TreeNode brotherNode){

this.brotherNode = brotherNode;

}

}

========================树类

package sonBrotherTree;

/**

*

* @author anping

* 主要是对树的实现

* 不提供删除指定节点的方法,是因为该树的节点是没有指向父亲的

*/

public class SonBrotherTree {

private TreeNode root;//这个是根节点

public SonBrotherTree(int rootValue){

//构建树的时候需要吧根节点的值初始化一下

root= new TreeNode(null,null,rootValue);

}

//拿到根节点

public TreeNode getRoot(){

return this.root;

}

/**

* 插入儿子节点需要注意的是,假如已经有了儿子节点怎么办??

* 没有又怎么办??

* 假如没有的话好办,直接插入即可。

* 但是要是有的话,把原有的儿子变成现在儿子的兄弟

* @param targetNode

* @param value

*/

public TreeNode insertSonNode(TreeNode targetNode,int value){

TreeNode nowSonNode = new TreeNode(null, null, value);

TreeNode preSonNode = targetNode.getSonNode();

if(preSonNode!=null){

//先见前儿子变成现在儿子的兄弟,然后在添加儿子

nowSonNode.setBrotherNode(preSonNode);

}

targetNode.setSonNode(nowSonNode);

return nowSonNode;

}

/**

* 插入的兄弟要是有兄弟怎么办?吧现在的兄弟插入。而原有的兄弟变成现在兄弟的兄弟

* 如果没有,那么直接插入

* @param targetNode

* @param value

*/

public TreeNode insertBrotherNode(TreeNode targetNode ,int value){

TreeNode nowBrotherNode = new TreeNode(null, null, value);

TreeNode preBrotherNode = targetNode.getBrotherNode();

if(preBrotherNode!=null){

nowBrotherNode.setBrotherNode(targetNode.getBrotherNode());

}

targetNode.setBrotherNode(nowBrotherNode);

return nowBrotherNode;

}

/**

* 删除兄弟的时候如果只有这个兄弟那么先把兄弟的子孙全部删除,在删除该兄弟

* 如果还有其他的兄弟,那么需要保留其他的兄弟。

*/

public void deleteBrotherNode(TreeNode targetNode){

if(targetNode!=null &&targetNode.getBrotherNode()!=null)

{

this.destoryNode(targetNode.getBrotherNode());

}

}

/**

* 删除儿子的时候如果儿子不是null 的先吧儿子的子孙全删掉

* @param sonNode

*/

public void deleteSonNode(TreeNode targetNode){

if(targetNode!=null && targetNode.getSonNode()!=null){

this.destoryNode(targetNode.getSonNode() );

}

}

/**

* 通过遍历整颗树来拿取数据

* @param value

* @return

*/

public TreeNode searchValue(int value){

return this.searchValue(root, value);

}

/**

* 使用递归取出值,递归用的少,真的是不熟。

* @param node

* @param value

* @return

*/

public TreeNode searchValue(TreeNode node,int value){

if(node.getValue()==value){

return node;

}

if (node.getValue()!=value&&node.getSonNode()!=null){

return searchValue(node.getSonNode(), value);

}

if(node.getValue()!=value&&node.getBrotherNode()!=null){

return searchValue(node.getBrotherNode(), value);

}

return null;

}

/**

* 已图形的方式遍历出来

*/

public static void main(String[] args) {

SonBrotherTree tree = new SonBrotherTree(12);

TreeNode rootSon = tree.insertSonNode(tree.getRoot(), 100);

TreeNode rootSonBrother = tree.insertBrotherNode(rootSon, 122);

tree.insertSonNode(tree.getRoot(),101);

tree.insertSonNode(rootSonBrother,101);

System.out.println(tree.getRoot().getValue()+”–”+tree.getRoot().getSonNode().getValue()+”—”+tree.getRoot().getSonNode().getBrotherNode().getValue());

TreeNode search = tree.searchValue(101);

System.out.println(search);

}

private void destoryNode(TreeNode node){

if(node.getSonNode()!=null){

destoryNode(node.getSonNode());

}

if(node.getBrotherNode()!=null){

destoryNode(node.getBrotherNode());

}

node.notify();

node=null;

}

}

java兄弟_java实现兄弟孩子树代码相关推荐

  1. java图像增强_java图片对比度调整示例代码

    前言 本文主要给大家介绍了关于java图片对比度调整的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下 测试代码 public static void main(Stri ...

  2. java冗余_Java使用lombok消除冗余代码的方法步骤

    一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法. lombok项目的产生就是为了 ...

  3. java饼图_java 百分比饼图的实现代码

    文章介绍了利用jfreechart来实现在java中的百分比饼图效果,有需要的同这可以参考一下. 一个显示百分比的饼图如下 实现代码  代码如下 复制代码 import="org.jfree ...

  4. java 条件编译_Java条件编译:如何防止代码块被编译?

    Java条件编译:如何防止代码块被编译? 我的项目需要Java 1.6进行编译和运行. 现在,我有一个要求使其与Java 1.5一起使用(从市场营销方面). 我想替换方法主体(返回类型和参数保持相同) ...

  5. java来电_JAVA来电显示接口调用代码实例

    代码描述:基于JAVA的来电显示接口调用代码实例 关联数据:手机固话来电显示 接口地址:http://www.juhe.cn/docs/api/id/72 import java.io.Buffere ...

  6. java 二分法_java实现二分法的完整代码

    二分法查找,顾名思义就是要将数据每次都分成两份然后再去找到你想要的数据,我们可以这样去想,二分法查找很类似与我们平时玩的猜价格游戏,当你报出一个价格时裁判会告诉你价格相对于真实值的高低,倘若是低了那我 ...

  7. java排他_Java排他锁实现的代码详解

    这篇文章主要介绍了Java编程实现排他锁的相关内容,叙述了实现此代码锁所需要的功能,以及作者的解决方案,然后向大家分享了设计源码,需要的朋友可以参考下. 一 .前言 某年某月某天,同事说需要一个文件排 ...

  8. java generate()_Java IntStream generate()用法及代码示例

    IntStream generate(IntSupplier s)返回一个无限顺序无序流,其中每个元素由提供的IntSupplier(提供int值的结果)生成.这适用于生成恒定流,随机元素流等. 用法 ...

  9. java formatter()_Java Formatter locale()用法及代码示例

    locale()方法是java.util.Formatter的内置方法,该方法返回语言环境.此区域设置由格式化程序构造设置.具有语言环境参数的该对象的format方法不会更改此值. 用法: publi ...

最新文章

  1. 批处理编程的异类——时钟(Clock)
  2. SPOJ - LIS2 Another Longest Increasing Subsequence Problem
  3. python循环语句-Python-循环语句及循环控制语句
  4. 凡客即便走小米模式也很难
  5. android listview 中的checkbox,Android中ListView与CheckBox的使用,及问题解决
  6. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果
  7. 计算机仿真作业三,计算机仿真技术作业三.doc
  8. 《盘点那些秀你一脸的秒天秒地算法》(3)
  9. Hadoop伪分布安装详解(一)
  10. JS面向对象编程实现
  11. 数据结构(六) 排序
  12. Java 实现 RSA 非对称加密算法-加解密和签名验签
  13. monkey4444勒索病毒解密方法方案成功处理复旦安全实验室
  14. hive 复合结构Map、Struct详解
  15. Thinkpad笔记本没有声音的解决办法参考
  16. 倍福BECKHOFF PLC:自动化编程入门1
  17. 多线程抓取链家网数据
  18. Windows本地认证
  19. wald检验_Stata: 面板 Granger 因果检验
  20. java手机游戏ios_我的世界JAVA版本ios版

热门文章

  1. ORA-01034:ORACLE not available问题的解决方法
  2. web跨域问题解决方案
  3. Rails I18n验证弃用警告
  4. 如何使用JavaScript从字符串中删除空格?
  5. 如何使用Google Maps API禁用鼠标滚轮缩放
  6. 什么是Android上的“上下文”?
  7. 函数式编程会取代GoF设计模式吗?
  8. 在Python中给定包含该项目的列表的情况下查找项目的索引
  9. clion打开时如何不自动重新打开上一次的项目
  10. EL表达式+JSTL,forEach的两种用法