我的程序只返回树的根,而不是打印整个树

时间:2018-09-05 11:18:02

标签: java tree

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 :(得分:2)

基本上,当您使用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中变量的范围

答案 1 :(得分:1)

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);
}

答案 2 :(得分:1)

您正在所有递归方法调用中创建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);
}