java遍曆樹(深度遍曆和廣度遍曆)

來源:互聯網
上載者:User
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));   }  } }}

 


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.