如何在非二叉树中的一次递归搜索中获取节点的深度

时间:2014-02-11 06:39:11

标签: java data-structures recursion tree

根据Recursive search for a node in non-binary tree,我知道如何实现递归搜索但是如何获得此节点的深度呢?

我想我应该为每次递归添加一个计数器,但我不知道应该在哪里添加这个计数器......

谢谢

2 个答案:

答案 0 :(得分:1)

以下是带注释的部分代码:

public class Tree
{
    private Node root;

    public int findDepth(int searchNodeValue) {
        List<Node> nodesAtCurrentLevel = Collections.singletonList(root);

        return recursiveSearch(0, searchNodeValue, nodesAtCurrentLevel);
    }

    public int recursiveSearch(int level, int searchNodeValue, List<Node> nodesAtCurrentLevel) {
        List<Node> nodesAtNextLevel = new ArrayList<Node>();

        // Check if searchNode matches any node at current level
        for (Node node : nodesAtCurrentLevel) {
            // If it matches, we have found the node, return current level
            if (node.getValue() == searchNodeValue) {
                return level;
            }

            // Add children of all nodes at current level in nodesAtNextLevel
            if (node.hasChildren()) {
                nodesAtNextLevel.addAll(node.getChildren());
            }
        }

        // searchNode is not found at current level, increment level and continue search at next level if next level exists in tree
        if (!nodesAtNextLevel.isEmpty()) {
            return recursiveSearch(level + 1, searchNodeValue, nodesAtNextLevel);
        }

        // We have traversed entire tree. Node not found. Return -1
        return -1;
    }
}

class Node
{
    private int value;

    private List<Node> children = new ArrayList<Node>();

    public Node(int value) {
        this.value = value;
    }

    public boolean hasChildren() {
        return children.isEmpty();
    }

    public int getValue() {
        return value;
    }

    public List<Node> getChildren() {
        return children;
    }
}

答案 1 :(得分:0)

已编辑

- 让递归函数获得输入级别。从0 / -1开始。归还一个物体;对象具有节点和级别。递归函数的每次传递都会递增传入的级别并在返回对象中设置它。

- 将级别传递给递归函数。以0 / -1开始。维护一个全局变量(或一个非函数定义的变量,以便在函数的每次迭代中访问相同的变量;即变量不在堆栈上但在堆上。我希望这个事情很简单。 Java并且不需要进一步解释)。在递归函数开始时将其设置为(1 +传递级别)。这不是线程安全的。

//原始答案有想法在级别中作为引用传递并在递归函数内递增它。显然在Java中这很乏味。