我希望在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值并完成了。我在最后一个小时左右一直在研究这个问题,似乎无法想出更好的东西,所以我想我会转向你们。
我哪里出错了/我应该怎么做?
答案 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);
}