四)绘树

实测代码:

import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.junit.Test;

public class Digui {

    @Test
    public void drawTree() {
        List<Node> nodeList = new ArrayList<Node>();
        nodeList.add(new Node("0001", "null", "中国"));
        nodeList.add(new Node("0002", "0001", "河北"));
        nodeList.add(new Node("0003", "0001", "辽宁"));
        nodeList.add(new Node("0004", "0002", "石家庄"));
        nodeList.add(new Node("0005", "0003", "沈阳"));
        nodeList.add(new Node("0006", "null", "美国"));
        nodeList.add(new Node("0007", "0006", "纽约"));
        System.out.println(children("null", nodeList));
    }

    // 递归条件:1. 延伸 2.有尽头
    public JSONArray children(String my, List<Node> nodes) {
        JSONArray myChildren = new JSONArray();
        for (Node node : nodes) {
            String id = node.getId();
            String pid = node.getPid();
            if (my.equals(pid)) {
                JSONObject myChild = new JSONObject();
                myChild.put("id", id);
                myChild.put("pid", pid);
                myChild.put("name", node.getName());
                JSONArray myChildChildren = children(id, nodes);
                if (myChildChildren.size() > 0)
                    myChild.put("children", myChildChildren);
                myChildren.add(myChild);
            }
        }
        return myChildren;
    }

}

class Node {
    public Node(String id, String pid, String name) {
        this.id = id;
        this.pid = pid;
        this.name = name;
    }

    private String id;
    private String pid;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node [id=" + id + ", pid=" + pid + ", name=" + name + "]";
    }
}

打印结果:

[{"id":"0001","pid":null,"name":"中国","children":[{"id":"0002","pid":"0001","name":"河北","children":[{"id":"0004","pid":"0002","name":"石家庄"}]},{"id":"0003","pid":"0001","name":"辽宁","children":[{"id":"0005","pid":"0003","name":"沈阳"}]}]},{"id":"0006","pid":null,"name":"美国","children":[{"id":"0007","pid":"0006","name":"纽约"}]}]

格式化结果:

[
    {
        "id": "0001",
        "pid": null,
        "name": "中国",
        "children": [
            {
                "id": "0002",
                "pid": "0001",
                "name": "河北",
                "children": [
                    {
                        "id": "0004",
                        "pid": "0002",
                        "name": "石家庄"
                    }
                ]
            },
            {
                "id": "0003",
                "pid": "0001",
                "name": "辽宁",
                "children": [
                    {
                        "id": "0005",
                        "pid": "0003",
                        "name": "沈阳"
                    }
                ]
            }
        ]
    },
    {
        "id": "0006",
        "pid": null,
        "name": "美国",
        "children": [
            {
                "id": "0007",
                "pid": "0006",
                "name": "纽约"
            }
        ]
    }
]

实际项目应用见:SMSE

为 easyui-tree

时间: 2024-10-19 13:54:30

四)绘树的相关文章

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

四棵树怎么种才能使任意两颗之间距离相等

1.从宏观来看,把这四颗树看成四个质点 第一种办法是把它们种在一起,这样两两之间距离都为0: 第二种办法是使它们形成一个三棱锥,比如可以在山顶种一棵树,在山脚分三个方位种三棵树:或者在坑底种一棵树,坑外面分别种三棵树. 2.从微观来看,这四颗树都是有形状的,那么重点就在于他们之间的“距离”怎么定义. 第一.如果这四颗树不是笔直(树干长歪了,考虑树冠.枝干和叶子)的话,那么需要根据它们具体的形状来给出具体的解决方案,有兴趣的同学可以由此开发一个仿生数学模型: 第二.如果这四颗树都是笔直的,那么它们

士兵杀敌(四)(树状数组+线段树)

士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧. 假设起始时所有人的军功都是0. 输入

第四章节 树

一.预备知识  二.二叉树 三.查找树ADT-----二叉查找树 四.AVL树 五.伸展树 六.树的遍历 七.B树 八.标准库中的集合与映射

第四章节 树(2)

目录 一.预备知识 二.二叉树 三.查找树ADT-----二叉查找树 四.AVL树 五.伸展树 六.树的遍历 七.B树 八.标准库中的集合与映射 五.伸展树 六.树的遍历 中序遍历:二叉查找树可以很方便的按顺序输出项.这种用于树的时候是中序遍历. 后序遍历:有时我们要先处理两个叶子节点再处理当前节点.如为了计算一个节点的高度,我们要先知道两个儿子的高度. 先序遍历:当前节点在儿子处理前处理.如想标记每一个节点的深度. 所有的有一个共同点:先处理null情况 ,再处理其它的. 七.B树 基于这样的

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处

数据结构(四)树---二叉树实现

(一)顺序结构创建二叉树 #include <stdio.h> #include <stdlib.h> #include <math.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 //存储空间初始分配量 #define MAX_TREE_SIZE 100 //二叉树的最大结点数 typedef char TElemType; typedef int S

数据结构(四)树---树的转换

(一)树转二叉树 步骤 1.加线:在所有兄弟结点之间加一条连线 2.去线:对树中每个结点,只保留他与第一个长子结点的连线,删除他与其他孩子结点之间的连线 3.层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使结构层次分明. 注意:第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子 转换后,根节点只有左子树,最左侧链表不改变 (二)森林转二叉树 步骤 1.将每个树转换为二叉树 2.第一棵二叉树不动,从第二棵二叉树开始,依次吧后一棵二叉树的根节点作为前一棵二叉树的根节点的右子

数据结构(四)树---集合的表示及查找(并查集)

一:集合运算 交,并,补,差,判断一个元素是否属于某一集合 并查集将在判断连通性和是否成环上面起到至关重要的作用 二:并查集 (一)集合并 并集间有一元素相连 (二)查某元素属于什么集合 可用树来表示集合,每个结点代表一个集合元素 S1={1,2,4,7} S2={3,5,8} S3={6,9,10} 我们可以使用双亲表示法来判断某个结点的根结点,从而判断是否是使用某个集合 #define MAX_TREE_SIZE 100 typedef int TElemType; typedef stru