2013-10-15 6 views
2

Я хотел бы знать, как я могу сделать, чтобы напечатать только определенный уровень двоичного дерева. Я читал здесь много вопросов о BFS, но не нашел ничего о printin только на одном уровне.Двоичное дерево, печать только на одном уровне (BFS)

Как я должен изменить общий поиск BFS для печати, позволяет сказать, только 2-го уровня этого дерева:

6 
/\ 
4 8 
/\/\ 
1 5 7 9 

Леве 2 будет 1, 5, 7, 9. Спасибо!

+0

Отслеживайте, на каком уровне вы сейчас находитесь, и завершаете, когда он доберется до 2. –

+0

Это довольно очевидно, но я не мог найти способ сделать это с помощью обычной BFS. Он обрабатывает очередь с узлами, но не делает, t различает уровни.Он просто вставляет в очередь и обрабатывает их в порядке BFS. Все, что я прихожу, - это какое-то странное решение, проверяющее количество узлов, которые должен иметь каждый уровень, но он рушится, когда я думаю о неполном дереве – nitrnitr

+0

Один из подходов состоит в том, чтобы помещать кортеж {level, node}, а не только {node}. –

ответ

0

Ok я получил ответ от профессора для подобной задачи.

В бинарном дереве поиска, найти наименьшее число на определенном уровне (GenericTree и GenericQueue конкретные классы конечно же я Перевод под все упражнения так что некоторые вещи могут показаться странным или нет.: P

public int calculateMinimum(BinaryTree<Integer> tree, int n){ 
    GenericQueue<BinaryTree<Integer>> queue = new GenericQueue<BinaryTree<Integer>>(); 
    queue.push(tree); 
    queue.push(new BinaryTree<Integer>(-1)); 
    int nActual = 0; //actual level 
    while (!queue.isEmpty()){ 
     tree = queue.pop(); 
     if (nActual == n){ 
      int min = tree.getRootData(); 
      while (!queue.isEmpty()){ 
       tree = queue.pop(); 
       if (!tree.getRootData().equals(-1) && (tree.getRootData()<min)) 
        min = tre.getRootData(); 
      } 
      return min; 
     } 
     if (!tree.getLeftChild().getRootData() == null)) 
      queue.push(tree.getLeftChild()); 
     if (!tree.getRightChild().getRootData() == null)) 
      queue.push(tree.getRightChild()); 
     if ((tree.getRootData().equals(-1) && (!queue.isEmpty())){ 
      nActual++; 
      queue.push(new BinaryTree<Integer>(-1)); 
     } 
    } 
    return -1; 
}     
1

Вам нужно иметь свойство уровня на вашем узле. И тогда, когда вы траверс на дереве, вы спросите:

if (level == 2) //or whatever level you wish 
{ 
    ... 
} 

Вот хороший пример: Find all nodes in a binary tree on a specific level (Interview Query)

Если нет уровня на узле, и вы не можете его изменить, то вы можете сделать он как глобальная переменная в методе, который вы выполняете, - не предпочтительнее, а еще одно решение. Я не проверял этот ответ в коде, но считаю, что он должен быть очень близок к решению.

например:

int level = 0; 

    public void PrintOneLevelBFS(int levelToPrint)  
    {  
     Queue q = new Queue(); 
     q.Enqueue(root); //Get the root of the tree to the queue. 

     while (q.count > 0) 
     { 
      level++; //Each iteration goes deeper - maybe the wrong place to add it (but somewhere where the BFS goes left or right - then add one level). 
      Node node = q.DeQueue(); 

      if (level == levelToPrint) 
      { 
       ConsoleWriteLine(node.Value) //Only write the value when you dequeue it 
      } 

      if (node.left !=null) 
      { 
       q.EnQueue(node.left); //enqueue the left child 
      } 
      if (n.right !=null) 
      { 
       q.EnQueue(node.right); //enqueue the right child 
      } 
     } 
    } 
+0

Спасибо, Миша, это хорошее решение, но что, если бы у вас не было этого свойства на узлах? Я нахожусь в университете компьютерных наук, и я думаю, что это может быть возможным испытанием. – nitrnitr

+0

@Pphax Я отредактировал ответ - проверьте это :) –

+0

Mm я не думаю, что он будет работать. Он будет увеличивать уровень каждый раз, когда цикл запускается (1 цикл = 1 узел, а затем не для каждого уровня). – nitrnitr

Смежные вопросы