Моя программа возвращает только корень дерева вместо печати всего дерева - PullRequest
0 голосов
/ 05 сентября 2018
public Queue<Integer> store_inorder(node n){
    Queue<Integer> q=new LinkedList<>();
    if(n.left!=null)store_inorder(n.left);
    q.add(n.data);
    if(n.right!=null)store_inorder(n.right);
    return q;
}

Я пытался сохранить выражение Inorder для дерева в очереди, но моя программа не работает. В чем проблема с моей программой?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018
public Queue<Integer> store_inorder(node n){
    //Create a queue where inorder traversal will be stored.
    Queue<Integer> q=new LinkedList<>();
    // call the function to store inorder traversal of tree rooted at 'n' into 'q'.
    store(n, q);
    return q;
}
public void store(node n, Queue<Integer> q){
    if(n.left!=null) store(n.left);
    q.add(n.data);
    if(n.right!=null) store(n.right);
}
0 голосов
/ 05 сентября 2018

Вы создаете Queue<Integer> q=new LinkedList<>(); во всех рекурсивных вызовах методов. Таким образом, вы можете решить эту проблему с помощью передачи параметров в метод. Так как;

в вашем вызове метода

..
// if you already have a queue list to add new node, please send to store_inorder method instead of creating new instance
Queue<Integer> q=new LinkedList<>();
store_inorder(node n,q);
//now in q , new node was set. 
//do it something on changed q.
..

И ваш метод должен измениться как;

public void store_inorder(node n, Queue<Integer> q) {
    if (n.left != null) store_inorder(n.left);
    q.add(n.data);
    if (n.right != null) store_inorder(n.right);
}
0 голосов
/ 05 сентября 2018

Обычно, когда вы используете Queue<Integer> q=new LinkedList<>();, вы заново создаете свою переменную q. Поэтому каждый раз, когда вы вызываете свой метод, вы получаете новый пустой LinkedList.

Чтобы это исправить, вам просто нужно хранить q вне метода, например:

Queue<Integer> q = new LinkedList<>();

public Queue<Integer> store_inorder(node n){
      if(n.left!=null)
          store_inorder(n.left);
      q.add(n.data);
      if(n.right!=null)
          store_inorder(n.right);
      return q;
}

Чтобы подробнее узнать, как это происходит, я предлагаю вам немного изучить область действия переменных в java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...