数据结构java语言描述朱战立_数据结构——树(Java语言描述)
樹根:rootNode. 樹只有一個樹根。
節點:Node. 樹上的所有節點。
子節點數組:Node[]. 數組代表每個節點的所有子節點
父節點:parentNode. 每個節點只有一個父節點。
2. Node為Tree中的內部類
parent :指向父節點的引用
childern: 孩子數組,存儲該節點的所有子節點。
T 為泛型參數,代表節點應該存儲什么類型的數據,是該節點的數據域。
size: 該節點所有的孩子數目。(孩子數組中所有元素的數目)
3.Tree類(Tree就是對樹進行增刪改查的實現類,該類內部維護了一個樹根節點。)
treeRoot:Tree進行維護的一個樹根節點。
cur:代表當前節點的引用,用于各種方法中,減少空間復雜度。
DEFAULT_SIZE:孩子節點數組的默認大小,數值為10.
findNodes():該方法返回當前節點的孩子節點數組。
find():該方法實現返回樹中節點的引用功能,用于遍歷樹節點并且提供當前操作節點的功能。
add():該方法實現對節點的添加,內部調用了find()與addNode()方法實現父類節點的查找與節點數組的動態擴容。
3.實現思路:
代碼1:建立一個Tree類。該類內部維護一個順序樹,對外提供基于樹的增刪改查的方法.該代碼是整個樹結構的組成單元。
@SuppressWarnings(value = "all")public class Tree{//Tree構造器,構造一個TreeRoot
publicTree() {
treeRoot= newNode();
}//基于數組的樹//孩子數組默認初始大小
static int DEFAULT_SIZE = 10;//樹根,Tree對象負責維護該對象。
privateNode treeRoot;//指向當前葉子的指針
privateNode cur;//節點內部類,樹結構的基本組成單位。
static class Node{//孩子數組中元素的個數
private int size = 0;//父節點指針
private Nodeparaent;private Node[] children = newNode[DEFAULT_SIZE];//葉子數據域
privateT t;//葉子名稱
privateString name;//Node對外提供兩個構造方法.一個無參構造用于構造樹根元素,另外一個負責構造葉子節點元素。
publicNode() {this.name = "樹根";
}publicNode(T t, String name) {this.t =t;this.name =name;
}
}
}
代碼2:add方法的實現
//方法需要傳入一個節點指針引用
public void add(Nodenode){//調用find()方法找到當前操作節點,然后通過addNode()方法添加到該節點的孩子數組中
Node parent =find();
addNode(parent, node);
}
代碼3:find()方法的實現:方法實現樹的查詢操作。
(代碼有點長,我寫的時候也有點暈了,不過想象成你在操作文件夾理解起來也許就會輕松很多~)
public Nodefind(){//使當前節點成為樹根節點
Node cur =treeRoot;
Scanner scanner= newScanner(System.in);//標識用戶操作的字符串
String flag = null;//標識節點在數組中的下標變量
int index = 0;//用于接收當前節點的孩子數組
Node[] nodes = null;//需要在循環條件下對節點進行挑選操作
while(true){
System.out.println("當前父節點:"+cur.name);
System.out.println("當前節點添加或者是否繼續遍歷子節點?");//
//(ps:按1遍歷當前節點的孩子數組,按2在當前節點插入葉子節點。就相當在當前文件夾添加文件,還是進入子文件夾中)
flag =scanner.nextLine();//如果選擇1,則表示遍歷當前節點的孩子數組。
if(flag.equals("1")){//通過finjNodes()方法得到當前節點的孩子節點數組
nodes =findNodes(cur);//如果數組中的元素個數為0,則結束本次操作。
if(cur.size==0){
System.out.println("無子節點,本次插入操作結束!");return null;
}//如果不為零則輸出所有不為null的孩子節點
for (int i = 0; i < nodes.length; i++) {if(nodes[i]!=null)
System.out.print(nodes[i].name+"("+i+")"+" ");
}//選擇一個節點進行操作
System.out.println("請選中一個節點(ps:選擇方式根據括號下標)");//操作使用while循環,防止用戶輸入字符不是數字而跳出try語句塊。
while(true){try{
index=Integer.valueOf(scanner.nextLine());
cur=nodes[index];if(cur==null){
System.out.println("節點不存在,請重新輸入");continue;
}break;
}catch(Exception e) {
System.out.println("輸入下標格式不正確,請重新輸入!");
}
}
}//不為1,則返回當前節點。
else{/**try {
} finally {
//System.out.println("關閉流");
//scanner.close();這里關閉流了,然后下次調用該方法反而會引發異常??
}*/System.out.println();returncur;
}
}
}
代碼4:addNode()方法:
//該方法傳入一個父節點與一個子節點指針
public void addNode(Node parent, Nodenode) {//如果父節點不為null
if(parent!=null){//得到父節點所有孩子的數量
int size =parent.size;//在增加元素之前調用enSureSize()方法,進行是否需要擴容檢查.
enSureSize(size+1, parent);//父節點增加一個元素
parent.children[size] =node;
parent.size++;
}
}
代碼5: enSureSize()方法。檢查是否需要調用gorw()方法實現動態擴容
public void enSureSize(intminCapcity, Node parent) {//minCapcity為父節點當前所有孩子的數量,從默認大小和孩子數量之間選擇一個較大數
minCapcity =Math.max(DEFAULT_SIZE, minCapcity);//如果孩子數量超過了當前數組的長度,則調用grow()方法
if (minCapcity - parent.children.length > 0)
grow(minCapcity, parent);
}
代碼6:grow()方法.。實現0.5倍的數組容量增長,或者整個數組的拷貝。
public void grow(int minCapcity, Nodeparent) {//限制數組的最大長度
if (minCapcity > Integer.MAX_VALUE - 8) {
System.out.print("數組長度超過最大長度限制");return;
}
Node[] arrys=parent.children;int oldLength =arrys.length, newLength;
newLength= oldLength + (int) (0.5 * oldLength);//0.5倍擴容//如果數量大于新的數組長度,則讓孩子數量為新的數組長度
if (minCapcity >newLength)
newLength=minCapcity;//Arrays工具類提供的一個native方法,實現數組的高效拷貝。
parent.children =Arrays.copyOf(arrys, newLength);
}
代碼7:主函數用for循環實現一個節點數為10的樹
public static voidmain(String[] args) {//實例化一個類型為String的Tree
Tree tree = new Tree();for (int i = 0; i < 10; i++) {//生成十個數據域為(0-10)隨機數,名稱為"Node"+i的葉子
tree.add(new Node(""+(int)(Math.random()*10), "Node"+i));
}
}
5.說明:
因為時間和個人能力有限,這次對于樹的操作算法繁瑣且有缺陷,因為每次查詢就不能再返回父節點的位置,有興趣的童鞋可以修改下代碼~~~~~
6.總結:
此篇文章是以自己的角度來想象樹應該是有怎么樣的一個結構,通過怎么樣的方法可以對它進行一系列的操作.其實通過文件系統我們可以更加理解樹的構造和基本操作,例如windows下磁盤驅動器就好比如樹的根節點,其子文件就相當于樹的一片片葉子。在驅動器的基礎上我們可以建立許多的文件夾,文件夾又可以放入許多的文件夾…雖然只提供了查詢和增加節點的操作,但是相信伙伴們能在find()方法的基礎上對節點實現刪除和更新操作.(后續繼續二叉樹和平衡二叉樹的總結)
————————————————
版權聲明:本文為CSDN博主「Mrjianghaokun」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Mrjianghaokun/article/details/99708541
總結
以上是生活随笔為你收集整理的数据结构java语言描述朱战立_数据结构——树(Java语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 两个字段排序,如何在Java中
- 下一篇: spring java code配置_S