java遍曆樹
如現有以下一顆樹:A B B1 B11 B2 B22 C C1 C11 C12 C2 D D1 D11
第一種方式深度優先遍曆 (最終返回的一棵壓扁的樹,依次從上往下)使用Stack,由於stack是先進後出,故實現方式為:
首先push一個初始節點到stack中,假定為A,
迴圈這個stack,只要不為空白則迴圈不結束,從stack中pop出第一個元素,把次元素放到一個list中,作為樹的返回結果顯示,擷取次元素的下一級子項目,如果有則把他們都push到stack中。
首先第一次進入迴圈的stack中只有A,把A元素從stack中pop出來後,第一個被放到list裡,然後擷取到A的一級子項目(BCD),把他們push到stack中,此時stack中有三個元素(BCD),進入第二次迴圈。
這次迴圈從stack中pop出第一個元素B(註:這裡的BCD擷取的先後順序符合先進後出原則)把B元素從stack中pop出來後,第一個被放到list裡,然後擷取到A的一級子項目(B1B2),把他們push到stack中,此時stack中有元素(B1B2CD),進入第三次迴圈。
這次迴圈從stack中pop出的應該是B1或者B2中的一個,後面和上訴的迴圈一致。
擷取的結果為A B B1 B11 B2 B22 C C1 C11 C12 C2 D D1 D11
第二種方式廣度優先遍曆使用list,由於list是集合,集合是先進先出,故實現方式為:
首先add一個初始節點到list中,假定為A,迴圈這個list,只要不為空白,則迴圈不結束,從這個list中取出第一個元素即A放到result(假定也是一個list)中,並且remove這個元素。然後擷取到A的一級子項目(BCD),把他們放到list中,此時list中有三個元素(BCD),進入第二次迴圈。
這次迴圈從list中取出第一個元素即B然後放到result中,並且remove這個元素。把B的一級子項目(B1B2)放入result中,此時list中元素為(CDB1B2),進入第三次迴圈。
這次迴圈和上兩次一樣,取出的第一個元素是C。
擷取的結果為A B C D B1 B2 C1 C2 D1 B11 B22 C11 C12 D11
代碼試例:
package com.order;import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.Stack;public class MytreeOrder { private static List<String> allElement = new ArrayList<String>(); public static void setElement() { allElement.add("A"); allElement.add("A1"); allElement.add("A2"); allElement.add("A3"); allElement.add("A4"); allElement.add("A11"); allElement.add("A21"); allElement.add("A22"); allElement.add("A41"); allElement.add("A42"); allElement.add("A111"); allElement.add("A421"); } public static void main(String[] args) { setElement(); deepOrder("A"); broadOrder("A"); } // 深度遍曆 public static void deepOrder(String oneElement) { if (allElement.contains(oneElement)) { Stack<String> s = new Stack<String>(); s.push(oneElement); while (!s.isEmpty()) { String now = s.pop(); StringBuffer t = getSpace(now); System.out.println(t.toString() + now); s.addAll(getChild("deep", now)); } } } // 根據傳入的string元素來返回需要的空格 private static StringBuffer getSpace(String now) { StringBuffer t = new StringBuffer(""); for (int i = 0; i < now.length(); i++) { t.append(" "); } return t; } // 擷取子項目 private static Collection<String> getChild(String mode, String oneElement) { List<String> childs = new ArrayList<String>(); for (int i = 0; i < allElement.size(); i++) { if (allElement.get(i).toString().length() == oneElement.length() + 1 && (allElement.get(i).toString().substring(0, oneElement.length()).equals(oneElement))) { if (mode.equals("deep")) { // 此處保證集合中最後一個元素是需要顯示在當前層級中第一個展示的子節點(因為堆棧中是最後一個元素先出) if (childs != null && childs.size() != 0 && Integer.valueOf(allElement.get(i).toString() .substring(1)) > Integer.valueOf(childs .get(0).toString().substring(1))) { childs.add(0, allElement.get(i)); } else { childs.add(allElement.get(i)); } } else { if (childs != null && childs.size() != 0 && Integer.valueOf(allElement.get(i).toString() .substring(1)) < Integer.valueOf(childs .get(0).toString().substring(1))) { childs.add(0, allElement.get(i)); } else { childs.add(allElement.get(i)); } } } } return childs; } // 廣度遍曆 private static void broadOrder(String oneElement) { if (allElement.contains(oneElement)) { List<String> l = new ArrayList<String>(); l.add(oneElement); while (!l.isEmpty()) { String now = l.get(0); l.remove(0); StringBuffer t = getSpace(now); System.out.println(t.toString() + now); l.addAll(getChild("broad", now)); } } }}