树形遍历(java)---孩子双亲表示法

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

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

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

  

时间: 2024-11-02 20:11:34

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

(java)树-双亲表示法

//数据类型 package org.mo.common.structure.tree; public class Student implements java.io.Serializable { /**  *   */ private static final long serialVersionUID = 1L; private int id; private String name; private int age; public int getId() { return id; } p

非递归实现先序遍历 java leecode 提交

写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈.2.因为栈顶的节点的左孩子为空,所以栈顶的的节点的左子树肯定访问完毕,所以出栈后直接指向右孩子.其实这里面有个思想迭代和递归的本质相同之处是什么?以后会写一篇我的思考. public class Solution { public List<Integer> preorderTraversal(T

数据结构 树的链式存储(双亲表示法)

//树的链式存储--双亲表示法 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_TREE_SIZE 100 typedef struct BPTNode { char data;//数据域 int parentPosition; //双亲的数组下标 char LRTag; //左右孩子标志域 }BPTNode; typedef struct BPTree { BPTNode node

6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第6章  树和二叉树 - 树的双亲表示法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.SequenceStack.c    

Lambda&Java多核编程-6-方法与构造器引用

在Lambda&Java多核编程-2-并行与组合行为一文中,我们对Stream<Contact>里的每一位联系人调用call()方法,并根据能否打通的返回结果过滤掉已经失效的项. 应该注意到此时filter(..)中Lambda的写法有些特殊: // ....filter(Contact::call)// ... 按常理我们应该使用s -> s.call(),但是这里却将参数.箭头以及对参数调用方法全部用其类型Contact的方法标签(暂且这样称呼)call来代替,而这个::就跟

后续遍历 java leecode

以前觉得后续遍历最难写,今天看了篇博客http://blog.csdn.net/sgbfblog/article/details/7773103,其实却是我们仔细比较后续遍历和先序遍历,其实后续遍历就是按照  根右左 的方式先序访问然后逆序就是答案了,会先序就会逆序了 leecode 的AC代码: public class Solution { public List<Integer> postorderTraversal(TreeNode root) { ArrayList<Integ

高效遍历Java容器

通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环. Steam API 的对比.简介Java 程序员经常使用容器,比如 ArrayList 和 HashSet.Java 8 中的 lambda 语法和 steaming API 可以让我们更方便的使用容器.大部分情况下,我们仅仅处理几千个元素,也不会去考虑性能问题.但是,在一些极端场景下,如果我们需要遍历上百万个元素,性能问题就凸显出来了.本文将采用 JMH 计算每块代码的运行时间

关于Java类加载双亲委派机制的思考(附一道面试题)

预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar).由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作. 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)

邻接矩阵的深度优先遍历(java版)

这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.datastruct; import java.util.Scanner; public class MGraph { //定义图结构,使用邻接矩阵存储 private static class Graph{ final int MAXVEX = 10;//最大顶点数 final int INFINITY