2016-04-04 67 views
1

我有一個二叉樹Similiar功能遍歷一個二叉樹

 public class Node 
    { 
      int value; 
      Node left; 
      Node right; 

      public Node getLeft() { 
       return left; 
      } 

     public Node getRight() { 
      return right; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 

而且在主要我有一個函數來遍歷它。 對於樹

5 
/\ 
    3 7 
/\ 
1 2 

首先一個創建具有廣度優先遍歷(5,3,7,1,2)的節點的隊列中。 第二個返回例如一個節點的值。 7代表2號或2代表4號。

private void queueOfTreaversed() { 
     LinkedList<Node> queue = new LinkedList<Node>(); 
     if (root != null) 
      queue.add(root); 

     while (!queue.isEmpty()) { 
      Node temp = queue.removeFirst(); 
      if (temp.getLeft() != null && temp.getRight() != null) { 
       traversed.add(temp); //there is a difference 
       queue.add(temp.getLeft()); 
       queue.add(temp.getRight()); 
      } 
     } 
    } 

    public int getValue(int n) { 
     LinkedList<Node> queue = new LinkedList<Node>(); 
     if (root != null) 
      queue.add(root); 

     while (!queue.isEmpty() && n>0) { 
      Node temp = queue.removeFirst(); 
      if (temp.getLeft() != null && temp.getRight() != null) { 
       queue.add(temp.getLeft()); 
       queue.add(temp.getRight()); 
      } 
     } 
     return queue.peekFirst().getValue(); //there is a difference 
    } 

而且我有重複的代碼,我不怎麼擺脫。 我使用在此期間穿過,並從此隊列中彈出元素,因此元素將不會按此順序穿過並且穿越無法使用。任何人都可以提供任何提示嗎?

+0

初始化第一個方法中的變量「遍歷」在哪裏? –

回答

2

一旦獲得遍歷節點traversed,您的getValue(int n)函數實際上可以索引到traversed以獲取所需的值。在你getValue(int n)功能,只需使用如下代碼:

if (n < traversed.size()) { 
    return traversed.get(n).getValue(); 
} 
throw new Exception("Element not existed"); 

爲了能夠使用traversed,只是返回它在你的queueOfTreaversed功能。

+0

我忘了說我在這個隊列中使用了**遍歷的**和pop元素,所以元素不會按這個順序排列,**遍歷**不能使用 – Mateusz

+0

@Mateusz還是,同樣的事情。因爲在你的'queueOfTraversed()'函數中你已經遍歷了整個樹。只需創建一個包含此函數中所有節點的列表並將其返回,這可以在'getValue()'函數中進一步使用。你不必特別使用'遍歷'。 –

+0

@Mateusz在我看來,你的'queueOfTraversed()'除了創建一個包含所有節點的廣度優先的隊列外別無其他。該隊列可以在該函數中返回或複製,然後在'getValue()'函數中使用。 –