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

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

以下是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. LocalContainerEntityManagerFactoryBean

    http://doc.okbase.net/liuyitian/archive/109276.html

  2. struts2用了哪几种模式

    代理模式 责任连模式 ActionVacation 迭代模式

  3. 用python实现k近邻算法

    用python写程序真的好舒服. code: import numpy as np def read_data(filename): '''读取文本数据,格式:特征1 特征2 -- 类别''' f=o ...

  4. Automotive Security的一些资料和心得(4):Automotive Safeguards

    通常一辆汽车会包括超过80个ECUs.所有软件代码大小正在快速增加,将会超过1GB.软件protection是必不可少的. 1. 软件保护 1.1. 安全boot Software violating ...

  5. 浅谈HTTP响应拆分攻击

    在本文中,我们将探讨何谓HTTP响应拆分以及攻击行为是怎样进行的.一旦彻底理解了其发生原理(该原理往往被人所误解),我们就可以探究如何利用响应拆分执行跨站点脚本(简称XSS).接下来自然就是讨论如果目 ...

  6. Java 开发者不容错过的 12 种高效工具

    Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松.目前,市面上涌现出越来越多的高效编程工具.所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用.正在使用或 ...

  7. 【Uva11212】 Editing a Book(IDA*)

    [题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也 ...

  8. 李洪强漫谈iOS开发[C语言-022]-算术运算符

  9. 156. Binary Tree Upside Down

    题目: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node ...

  10. 学习kernel编程的建议

    我把我学习kernel编程的过程介绍给大家,希望大家有个参考. 学习kernel编程需要阅读大量的kernel方面的书籍,在此我列举一下我读过的kernel书籍(按时间先后顺序),并给一些建议. 1. ...