2016-04-04 68 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()'函数中使用。 –