如何搜索具有三个子节点的树?

时间:2015-04-09 15:39:11

标签: java search tree children

我的树节点有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。但我必须从某个地方开始,我方法的唯一参数可以是名称。我似乎无法看到如何做到这一点。

4 个答案:

答案 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。这就是堆栈溢出的原因。