我的树节点有3个字符串字段和3个节点字段,分别是左,中,右。
其中一个问题是该方法只能将字符串作为参数
这就是我所拥有的
public TreeNode findNode(String name) {
TreeNode pointer = this.getRoot();
if (pointer.getName().equals(name))
return pointer;
if (pointer.getLeft() != null)
pointer = pointer.getLeft();
findNode(name);
if (pointer.getMiddle() != null)
pointer = pointer.getMiddle();
findNode(name);
if (pointer.getRight() != null)
pointer = pointer.getRight();
findNode(name);
return null;
}
这会导致堆栈溢出错误,因为我只是将指针设置为root。但我必须从某个地方开始,我方法的唯一参数可以是名称。我似乎无法看到如何做到这一点。
答案 0 :(得分:1)
您可以使用列表作为参数堆栈。
public TreeNode findNode(String name) {
List<TreeNode> stack = new ArrayList<TreeNode>();
stack.add(this.getRoot());
while (!stack.isEmpty())
{
TreeNode node = stack.remove(0);
if (node.getName().equals(name))
return node;
if (pointer.getLeft() != null)
stack.add(node.getLeft());
if (node.getMiddle() != null)
stack.add(node.getMiddle());
if (node.getRight() != null)
stack.add(node.getRight());
}
return null;
}
如果您想深度优先搜索,可以从列表的末尾而不是列表的前面删除。
答案 1 :(得分:0)
除了字符串之外,还使用一个带有TreeNode
参数的辅助方法:
public TreeNode findNode(String name) {
return auxFindNode(this.getRoot(), name);
}
private TreeNode auxFindNode(TreeNode node, String name) {
//perform your recursive traversal here
}
您的代码将无法正常工作,因为您始终在方法开头将pointer
设置为树的根。因此,所有递归调用都以树的根开始。
如果您不想使用其他方法,可以使用堆栈迭代遍历树:
public TreeNode findNode(String name) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode foundNode = null;
while(!stack.empty() && foundNode == null) {
TreeNode node = stack.pop();
if(node.getName().equals(name)) {
foundNode = node;
} else {
if(node.getLeft() != null) {
stack.push(node.getLeft();
}
if(node.getMiddle() != null) {
stack.push(node.getMiddle());
}
if(node.getRight() != null) {
stack.push(node.getRight());
}
}
}
return foundNode;
}
答案 2 :(得分:0)
我猜你不能改变这个功能的签名。有一个辅助函数,它接受你用root和name调用的两个参数(Node和name)。
答案 3 :(得分:0)
在所有三种情况下(左,中,右),您正在调用findNode(name)
但不是针对这些对象,而是针对this
。这就是堆栈溢出的原因。