之前的工作都沒有接觸到樹,也就很少研究它。幸運地的是,在目前的工作中多次遇到樹型結構的資料,那麼訪問樹節點中的資料就是必然的了,而且還需要按照指定規則對節點中的資料進行額外處理。經過學習之後,對與樹相關的基本演算法有了一些認知,就計劃寫幾篇小文。其實這樣的文章早已是汗牛充棟,而我只是把它當作我的學習總結罷了,以加深記憶與理解,如能對其他朋友有所助益,則更感愉悅了 :-) (2009.04.01最後更新)
這次先從最基礎的開始--樹的遍曆。本文使用了兩種極常用的方法來遍曆樹中的所有節點--遞迴;迭代,但它們實現的都是深度優先(Depth-First)演算法。
1. 樹節點與資料
先定義樹節點及資料(使用者物件),並建立測試用的資料。
TreeNode是樹節點的定義。
/** * 樹節點的定義。 */public interface TreeNode { /** * 擷取指定下標處的子節點。 * * @param index * 下標。 * @return 子節點。 */ public TreeNode getChildAt(int index); /** * 返回指定子節點的下標。 * * @param index * 下標。 * @return 子節點。 */ public int getChildIndex(TreeNode index); /** * 擷取子節點的數量。 * * @return 子節點的數量。 */ public int getChildCount(); /** * 返回父節點。 * * @return 父節點。 */ public TreeNode getParent(); /** * 設定父節點。註:此處不需要改變父節點中的子節點元素。 * * @param parent * 父節點。 */ public void setParent(TreeNode parent); /** * 擷取所有的子節點。 * * @return 子節點的集合。 */ public List<?> getChildren(); /** * 是否為分葉節點。 * * @return 是分葉節點,返回true;否則,返回false。 */ public boolean isLeaf();}