给定一个树形结构,如图:

将它转换为孩子双亲表示法:

以下是JAVA实现://先序遍历

import java.util.ArrayList;

public class TreeTraverse{

    static int[] father = {
0,1,1,1,2,2,2,6,6,6,8,4,4,12,13,13,13
};
static int[] child = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
}; public static void main(String[] arg){
ArrayList<Tree> trees = new ArrayList<>();
trees.add(new Tree(0));
int len = child.length;
for(int i = 0 ; i != len ; i ++ ){
trees.add(new Tree(child[i]));
}
for(int i = 0 ; i != len ; i ++ ){
Tree _father = trees.get(father[i]);
if(_father.getFChild()==null){
_father.setFChild(trees.get(child[i]));
System.out.println("父亲为 " + father[i] + " 大孩子为 " + child[i]);
continue;
}
Tree sibiling = _father.getFChild();
while(sibiling.getChildSibling()!=null){
sibiling = sibiling.getChildSibling();
}
sibiling.setChildSibling(trees.get(child[i]));
System.out.println("孩子为 " + sibiling.getNum() + " 右兄弟为 " + child[i]);
}
traverse(trees.get(0));
} static void traverse(Tree father){
if(father.getFChild()==null){
return;
}
System.out.print(father.getFChild().getNum() + " ");
traverse(father.getFChild());
Tree sibiling = father.getFChild();
while(sibiling.getChildSibling()!=null){
sibiling = sibiling.getChildSibling();
System.out.print(sibiling.getNum() + " ");
traverse(sibiling);
}
} static class Tree{
private int num;
private Tree fChild;
private Tree childSibling; public Tree(int num) {
super();
this.num = num;
} public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public Tree getFChild() {
return fChild;
} public void setFChild(Tree fChild) {
this.fChild = fChild;
} public Tree getChildSibling() {
return childSibling;
} public void setChildSibling(Tree sibling) {
this.childSibling = sibling;
} }
}

输出为:

父亲为 0 大孩子为 1
父亲为 1 大孩子为 2
孩子为 2 右兄弟为 3
孩子为 3 右兄弟为 4
父亲为 2 大孩子为 5
孩子为 5 右兄弟为 6
孩子为 6 右兄弟为 7
父亲为 6 大孩子为 8
孩子为 8 右兄弟为 9
孩子为 9 右兄弟为 10
父亲为 8 大孩子为 11
父亲为 4 大孩子为 12
孩子为 12 右兄弟为 13
父亲为 12 大孩子为 14
父亲为 13 大孩子为 15
孩子为 15 右兄弟为 16
孩子为 16 右兄弟为 17
1 2 5 6 8 11 9 10 7 3 4 12 14 13 15 16 17

  

树形遍历(java)---孩子双亲表示法的更多相关文章

  1. UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)

    我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献. 另外这题主要就是Trie树的孩子兄弟表示法: ...

  2. java算法之冒泡排序法

    由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即   for(inti=0;i& ...

  3. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  4. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  5. 循环遍历Java字符串字符的规范方法——类似python for ch in string

    比如我将string作为CNN 文本处理输入: float [] input = new float[maxLength]; // 1 sentence by maxLenWords // int[] ...

  6. 选课 - 树型DP(孩子兄弟建树法)

    题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课并考核通 ...

  7. 邻接表的广度优先遍历(java版)

    到 0 的权是 91 到 2 的权是 31 到 3 的权是 61 到 4 的权是 7 2 到 0 的权是 22 到 3 的权是 5 3 到 0 的权是 33 到 4 的权是 1 4 到 2 的权是 2 ...

  8. 数据结构 -- 简单图的实现与遍历 (Java)

    ---恢复内容开始--- 作者版权所有,转载请注明出处,多谢. http://www.cnblogs.com/Henvealf/p/5534071.html 前些天因为某些原因,就试着回想一下图(gr ...

  9. Java使用选择排序法对数组排序

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

随机推荐

  1. 2014年度辛星css教程夏季版第三节

    第二节我们讲述的几乎全是CSS的选择器,那么下面这一节我们来讲一下CSS的颜色和文本的一些东西,虽然我对调色不大敏感,但是对于颜色还是比较感兴趣的. *********CSS中的颜色********* ...

  2. RadioGroup 的 RadioButton 选择改变字体颜色和背景颜色

    RadioGroup <RadioGroup android:id="@+id/client_charge_radiogroup" android:layout_width= ...

  3. 《暗黑世界》安卓APK 编译流程详细说明教程!(图文)

    原地址:http://bbs.gameres.com/forum.php?mod=viewthread&tid=223671 关于开发环境的搭建,之前的相关文档已经很详细的说明,对环境的搭建请 ...

  4. TSS 任务状态段

    TSS(任务状态段) 1 什么是TSS TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息.  2 TSS工作细节 TSS在任务切换过程 ...

  5. ASP.NET MVC 入门1、简介

    什么是MVC模式 MVC(Model-View-Controller,模型-视图-控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Co ...

  6. easyui源码翻译1.32--Messager(消息窗口)

    前言 使用$.messager.defaults重写默认值对象.下载该插件翻译源码 消息窗口提供了不同的消息框风格,包含alert(警告框), confirm(确认框), prompt(提示框), p ...

  7. SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-004-Pizza例子的用户流程(flowExecutionKey、_eventId_phoneEntered、flowExecutionUrl )

    一. 1. 2. 3.customer-flow.xml 自己定义customer,最后output <?xml version="1.0" encoding="U ...

  8. VCL+FMX 双剑合壁编程

    VCL 是经典,FMX 是新生,新生事物总会带来一些好玩新奇的东西.舍弃经典是浪费,不了解新生事物是等死,那么我们来一个二合一双剑合壁又如何呢? 要双剑合壁,就得投些机,取些巧.由于 Delphi / ...

  9. 判断微信内置浏览器的UserAgent

    要区分用户是通过"微信内置浏览器"还是"原生浏览器"打开的WebApp, 可以通过navigator.userAgent来进行判断. 以下是对各种平台上微信内置 ...

  10. Java 输入流读取文本文件换行符问题

    一问题 在学习流编程的过程中,我遇到了一下问题.首先来看一下我写的java源程序: package StreamLearn; import java.io.*; public class TestFi ...