使用二进制搜索树inOrder中的数据填充列表

时间:2016-11-23 02:17:43

标签: java list binary-search-tree

我希望在List中按顺序存储二叉搜索树的值。 我有一个调用帮助器方法的公共方法,但是当我打印返回的列表时,我总是得到一个空列表......

public List inOrderList(){
    return inOrderList(overallRoot);   //root value
}

private List inOrderList(SearchTreeNode root){
    List<E> list1 = new ArrayList<E>();    //new list (will be returned)
    if(root==null){
        return list1;     //returns empty list
    }
     //List is NOT empty, let's do this thing.
    else {
        //create a new list, that calls left method recursive on left node
        List<E> podo = inOrderList(root.left);
        //Here, I *believe* we've reached the bottom. Add every podo to list1   
        list1.addAll(podo);

        //do the same thing for the right tree
        List<E> dopo = inOrderList(root.right);
        list1.addAll(dopo);        
   }

    //return the list we just filled from our BST
    return list1;
}

我选择不单独使用数据来填充我的列表。我想使用addAll并以这种方式存储一切将是更好的选择。鉴于此解决方案无效,我也尝试存储数据。

private List<Integer> inOrderList(IntTreeNode root){
    List<Integer> list1 = new ArrayList<Integer>();
    if(root==null){
        return list1;
    } else { 
        while(root!=null){
            List<Integer> podo = inOrderList(root.left);
            list1.add(root.data);
            List<Integer> dopo = inOrderList(root.right);
            list1.add(root.data);
        }
   
    }
    return list1;
}
   

我发现这至少填满了一个列表,但它只是插入了两次root值并完成了。我在最后一个小时左右一直在研究这个问题,似乎无法想出更好的东西,所以我想我会转向你们。

我哪里出错了/我应该怎么做?

2 个答案:

答案 0 :(得分:1)

在伪代码中,您的函数看起来像这样。我建议你尝试调试器并检查它在较小的输入上是如何工作的。

private void inOrder(Node node, List<Integer> list) {
  if (node == null) {
    return;
  }
  inOrder(node.left, list);
  list.add(node.data);
  inOrderList(node.right, list);
}

答案 1 :(得分:0)

我意识到我只是以错误的方式接近它。

解决方案:

public List<E> inOrderList() {
List<E> list = new ArrayList<E>();
inOrderList(overallRoot, list);
return list;

}
//helper method
private void inOrderList(SearchTreeNode root, List<E> list) {
if(root == null)
    return;       
inOrderList(root.left, list);
list.add((E)root.data);
inOrderList(root.right, list);

}