日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java树父节点_Java基础 - 树的实现(一)父节点表示法

發布時間:2023/12/29 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java树父节点_Java基础 - 树的实现(一)父节点表示法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

父節點表示法:

通過前面的介紹可以發現,樹中除根節點之外的每個節點都有一個父節點。為了記錄樹中節點與節點之間的父子關系,可以為每個節點增加一個parent域,用來記錄該節點的父節點。對于如下圖所示的數,可以用一個表(數組)來保存它。

下表記錄示范樹

數組索引

data

parent

0

A

-1

1

B

0

2

C

0

3

D

0

4

E

1

5

F

3

6

G

3

7

H

4

8

I

4

9

J

4

10

K

6

...

...

...

由此可見,只要用一個數組節點來保存樹里的每個節點,并讓每個節點都記錄它的父節點在數組中的索引位置即可。下面的程序實現了父節點表示法的樹:

import java.util.ArrayList;

import java.util.List;

/**

* @see 父節點表示法

* @author wb

*

* @param

*/

public class TreeParent {

public class Node {

T data;

int parent;

Node(){

}

Node(T data){

this.data = data;

}

Node(T data, int parent){

this(data);

this.parent = parent;

}

public String toString(){

return "TreeParent$Node[data = " + data + ", parent = " + parent + "]";

}

}

private final int DEFAULT_TREE_SIZE = 100;

private int treeSize = 0; //相當于容量吧

//用來記錄樹中所有的節點

private Node[] nodes;

//用來記錄樹中節點的個數

private int nodeNums;

/**

* 三種構造方法

*/

@SuppressWarnings("unchecked")

public TreeParent(){

treeSize = DEFAULT_TREE_SIZE;

nodes = new Node[treeSize];

}

public TreeParent(E element){

this();

nodes[0] = new Node(element, -1);

nodeNums ++;

}

@SuppressWarnings("unchecked")

public TreeParent(E element, int initSize){

treeSize = initSize;

nodes = new Node[treeSize];

nodes[0] = new Node(element, -1);

nodeNums ++;

}

//判斷樹是否為空

public boolean isEmpty(){

return nodes[0] == null;

}

//返回根節點

public Node root(){

return nodes[0];

}

/**

* 為指定節點添加子節點

* @param element : 數據元素

* @param parent : 某節點(要添加子節點的節點)

*/

public void addNode(E element, Node> parent){

//找到nodes數組中第一個為null的位置并將新的節點添加到該位置

for(int i = 0; i < treeSize; i ++){

if(nodes[i] == null){

Node newNode = new Node(element, pos(parent));

nodes[i] = newNode;

nodeNums ++;

return;

}

}

throw new RuntimeException("該樹已滿,無法添加新節點!");

}

/**

* 返回指定節點的父節點

* @param node:某指定節點

* @return:返回指定節點的父節點

*/

public Node parent(Node> node){

return nodes[node.parent];

}

/**

* 返回指定節點(非葉子節點)的所有子節點

* @param node:指定節點(非葉子節點)

* @return:所有子節點

*/

public List> childen(Node> node){

List> list = new ArrayList>();

int indexParen = pos(node);

for(int i = 0; i < treeSize; i ++){

if(nodes[i] != null && nodes[i].parent == indexParen){

list.add(nodes[i]);

}

}

return list;

}

/**

* @see :deep of this tree

* @return:返回該樹的深度

*/

public int deep(){

int max = 0;

for(int i = 0; i < treeSize && nodes[i] != null; i ++){

//初始化本節點的層次

int def = 1;

//

int pindex = nodes[i].parent;

while(pindex != -1 && nodes[pindex] != null){

//

pindex = nodes[pindex].parent;

def ++;

}

if(max < def){

max = def;

}

}

return max;

}

/**

* 根據指定節點返回在節點數組中的索引位置

* @param parent:指定節點

* @return:返回指定在節點數組中的索引位置

*/

public int pos(Node> parent) {

for(int i = 0; i < treeSize; i ++){

if(parent == nodes[i]){

return i;

}

}

return -1;

}

}從上面的程序可以看出,定義樹節點時增加了一個parent域。該parent域用于保存該節點的父節點在數組中的位置索引,通過這種方法即可記錄樹中節點之間的父子關系。使用這種父節點表示法來存儲樹時,添加節點時將新節點的parent域的值設為其父節點在數組中的索引即可。下面是測試代碼:

import java.util.List;

import com.yc.tree.TreeParent;

public class TreeParentTest {

public static void main(String[] args) {

TreeParent tree = new TreeParent("root");

System.out.println("此時樹的深度為: " + tree.deep());

System.out.println();

TreeParent.Node root = tree.root();

tree.addNode("節點1", root);

tree.addNode("節點2", root);

System.out.println("此時樹的深度為: " + tree.deep());

System.out.println();

List.Node> list = tree.childen(root);

System.out.println( "根節點的第一個子節點為:" + list.get(0));

//為根節點的第一個子節點添加子節點

tree.addNode("節點3", list.get(0));

System.out.println( "此時樹的深度為: " + tree.deep());

}

}

測試結果為:

通過上面的介紹可以發現,父節點表示法的特點是,每個節點都記錄了它的父節點以至于可以快速的找到其父節點,但如果要去找每個節點的所有子節點就比較麻煩,程序要遍歷整個節點數組(盡管遍歷很快??)。

總結

以上是生活随笔為你收集整理的java树父节点_Java基础 - 树的实现(一)父节点表示法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。