我們在前面介紹了很多典型的線性結構,如隊列,堆棧,數組,她們至多只有一個尾節點。這是非常容易理解的。
下面我們要來介紹一個非線性結構,樹(tree):
樹不在是一對一的數據結構,而是一對多的非線性連接:
這里有幾個規定:
- 圖中的結構就像一棵倒過來的樹,最頂部的節點就是“根節點 (root 節點)”
- 每棵樹至多只有一個根節點
- 根節點生出多個孩子節點,每個孩子節點只有一個父節點,每個孩子節點又生出多個孩子
- 父親節點 (parent) 和孩子節點 (child) 是相對的
- 沒有孩子節點的節點成為葉子節點 (leaf)
樹的相關術語:
1)節點的度:
一個節點直接含有的子樹個數,上圖中3的度為2,10的度為1;
2)樹的度:
一個樹里面節點的度的最大值。例如上圖的樹的度為2;
3)節點的層次:
從根節點開始算起,根節點算第一層,上圖中3為第二層,13為第四層;
4)樹的高度:
從葉節點開始,從下往上增加;
5)樹的深度:
從根節點開始,從上往下增加;
上看給出的信息是非常非常重要的,一定要熟練掌握。
由上述描述,我們一般可以通過兩種方式實現一棵簡單的樹:
1)數組實現。
package treeTest; public class TreeNodebyArray<item> { private item mData; private int mParent; public TreeNodebyArray(item data,int parent){ mData=data; mParent=parent; } public item getData(){ return mData; } public int getMParent(){ return mParent; } public void setData(item data){ mData=data; } public void setParent(int parent){ mParent=parent; } public static void main(String[] args){ TreeNode[] arrayTree = new TreeNode[10]; } }
2)鏈表實現:
package treeTest; public class TreeNodebyLinkList<item> { private item mData; private TreeNodebyLinkList parent; private TreeNodebyLinkList kid; public TreeNodebyLinkList(item data,TreeNodebyLinkList parent){ mData=data; this.parent=parent; } public item getData() { return mData; } public void setData(item data) { mData = data; } public TreeNodebyLinkList getParent() { return parent; } public void setParent(TreeNodebyLinkList parent) { this.parent = parent; } public TreeNodebyLinkList getChild() { return kid; } public void setChild(TreeNodebyLinkList kid) { this.kid = kid; } public static void main(String[] args){ LinkedList<LinkedTreeNode> linkedTree = new LinkedList<>(); } }
當然,根據不同的樹的要求,我們需要在一定程度上更改樹內部的結構,所以實現代碼也會不同。上述代碼知識考慮了一種情況。