java 樹形結(jié)構(gòu)

樹實體類
  public class Node {

    private int id;//結(jié)點id
    private int pid;//父結(jié)點id
    private String name;//結(jié)點值
    private List<Node> children = new ArrayList<>();//孩子結(jié)點列表
    private Node parent;
    private int level;

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

    public int getId() {
        return id;
    }

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

    public int getPid() {
        return pid;
    }

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

    public String getName() {
        return name;
    }

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

    public List<Node> getChildren() {
        return children;
    }

    public void setChildren(List<Node> children) {
        this.children = children;
    }

    public Node getParent() {
        return parent;
    }

    public void setParent(Node parent) {
        this.parent = parent;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public boolean isRoot() {
        return parent == null;
    }

    public boolean isLeaf() {
        return children.size() == 0;
    }
}
樹結(jié)構(gòu)排序工具類
public class TreeHelper {

    public static List<Node> getSortedNodes(List<Node> datas) {
        List<Node> result = new ArrayList<>();
        // 設(shè)置Node間父子關(guān)系
        List<Node> nodes = convertData2Node(datas);
        // 拿到根節(jié)點
        List<Node> rootNodes = getRootNodes(nodes);
        // 排序以及設(shè)置Node間關(guān)系
        for (Node node : rootNodes) {
            addNode(result, node, 0);
        }
        return result;
    }

    private static List<Node> convertData2Node(List<Node> nodes) {

        for (int i = 0; i < nodes.size(); i++) {
            Node n = nodes.get(i);
            for (int j = i + 1; j < nodes.size(); j++) {
                Node m = nodes.get(j);
                if (m.getPid() == n.getId()) {
                    n.getChildren().add(m);
                    m.setParent(n);
                } else if (m.getId() == n.getPid()) {
                    m.getChildren().add(n);
                    n.setParent(m);
                }
            }
        }
        return nodes;
    }

    private static List<Node> getRootNodes(List<Node> nodes) {
        List<Node> root = new ArrayList<>();
        for (Node node : nodes) {
            if (node.isRoot())
                root.add(node);
        }
        return root;
    }

    private static void addNode(List<Node> nodes, Node node, int currentLevel) {
        node.setLevel(currentLevel);
        nodes.add(node);
        if (node.isLeaf())
            return;
        for (int i = 0; i < node.getChildren().size(); i++) {
            addNode(nodes, node.getChildren().get(i), currentLevel + 1);
        }
    }
}
測試類
public class Test {

    public static void main(String[] args) {
        List<Node> nodes = new ArrayList<>();
        nodes.add(new Node(1, 0, "組織架構(gòu)"));
        nodes.add(new Node(2, 1, "黨委a"));
        nodes.add(new Node(3, 1, "黨委b"));
        nodes.add(new Node(4, 2, "a支部1"));
        nodes.add(new Node(5, 2, "a支部2"));
        nodes.add(new Node(6, 2, "a支部3"));
        nodes.add(new Node(7, 3, "b支部1"));
        nodes.add(new Node(8, 3, "b支部2"));
        nodes.add(new Node(9, 4, "b支部3"));

        List<Node> list = TreeHelper.getSortedNodes(nodes);

        for (Node node : list) {
            for (int i = 0; i < node.getLevel(); i++)
                System.out.print("  ");
            System.out.println(node.getId() + " " + node.getName());
        }
    }
}
輸出結(jié)果
1 組織架構(gòu)
  2 黨委a
    4 a支部1
      9 b支部3
    5 a支部2
    6 a支部3
  3 黨委b
    7 b支部1
    8 b支部2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陈轿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磷账,老刑警劉巖嗓化,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲫寄,死亡現(xiàn)場離奇詭異就谜,居然都是意外死亡纷纫,警方通過查閱死者的電腦和手機(jī)叁扫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門三妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莫绣,你說我怎么就攤上這事畴蒲。” “怎么了对室?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵模燥,是天一觀的道長。 經(jīng)常有香客問我掩宜,道長蔫骂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任牺汤,我火速辦了婚禮辽旋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檐迟。我一直安慰自己戴已,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布锅减。 她就那樣靜靜地躺著糖儡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怔匣。 梳的紋絲不亂的頭發(fā)上握联,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天桦沉,我揣著相機(jī)與錄音,去河邊找鬼金闽。 笑死纯露,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的代芜。 我是一名探鬼主播埠褪,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挤庇!你這毒婦竟也來了钞速?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嫡秕,失蹤者是張志新(化名)和其女友劉穎渴语,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昆咽,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡驾凶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掷酗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片调违。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泻轰,靈堂內(nèi)的尸體忽然破棺而出技肩,到底是詐尸還是另有隱情,我是刑警寧澤糕殉,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站殖告,受9級特大地震影響阿蝶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黄绩,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一羡洁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爽丹,春花似錦筑煮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至初澎,卻和暖如春秸应,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工软啼, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留桑谍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓祸挪,卻偏偏與公主長得像锣披,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贿条,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1雹仿、算法的概念 (1)概念:是指解題方案的準(zhǔn)確而完整的描述。 【考題1】在計算機(jī)中闪唆,算法是指() A查詢方法B加工...
    成都小菜閱讀 1,567評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盅粪,服務(wù)發(fā)現(xiàn),斷路器悄蕾,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 在開始使用OpenCV前票顾,配置好它是第一步,本文就是介紹如何走好這個第一步的帆调。環(huán)境:Windows奠骄,Visual ...
    矩陣旋轉(zhuǎn)閱讀 1,151評論 0 1
  • 建軍節(jié)又到了,很想寫點東東紀(jì)念一下番刊,自己離開藍(lán)色軍營十八年了含鳞,按佛家的說法,已經(jīng)又一個輪回芹务。 這個輪回對于我來說蝉绷,...
    天涯孤旅背包客閱讀 261評論 3 4