遍历树数据结构以在一个循环中查找其高度和计数元素

时间:2016-08-04 10:27:12

标签: java algorithm tree

我有一个树形结构。

class Element {
    private List<Element> children;
}

Element treeStructure = produceSomeTreeStructure();
//How to get its height and number of elements.

直接解决方案是制作两个循环。首先,我可以找到节点数

A question on getting number of nodes in a Binary Tree (将此算法更改为非二叉树),

和第二个循环来获得树的高度 http://www.geeksforgeeks.org/iterative-method-to-find-height-of-binary-tree/

再次,将此算法应用于非二叉树。

我的问题,如何一步到位。我可以将结果保存在全局变量中。

4 个答案:

答案 0 :(得分:3)

如果你想知道节点的数量,那么你需要探索整个树。最简单的方法是使用深度优先搜索,您可以随时计算节点数。

深度优先搜索算法还可以轻松地计算其当前正在探索的深度,并且总体上达到最大深度。修改深度优先搜索算法,将这两个算法作为参数。

如果你以递归方式编码(最简单),那么每次进行递归调用时,只需在深度参数中添加一个。如果这给你的数字大于你追踪的最大值,那么将最大值更新为当前深度。

答案 1 :(得分:2)

是的,可以按照下面的代码显示。只需添加计数器totalNodeCount,并在每次遍历BFS样式的节点时执行+1

// Iterative method to find height and node-count of Binary Tree
int treeHeightAndNumOfNodes(node *root)
{
    // Base Case
    if (root == NULL)
        return 0;

    // Create an empty queue for level order tarversal
    queue<node *> q;

    // Enqueue Root and initialize height
    q.push(root);
    int height = 0;
    int totalNodeCount = 0; // <-- Use this counter to store total number of node traversed.

    while (1)
    {
        // nodeCount (queue size) indicates number of nodes
        // at current lelvel.
        int nodeCount = q.size();
        if (nodeCount == 0)
            return height;

        height++;

        // Dequeue all nodes of current level and Enqueue all
        // nodes of next level
        while (nodeCount > 0)
        {
            node *node = q.front();
            q.pop();
            if (node->left != NULL)
                q.push(node->left);
            if (node->right != NULL)
                q.push(node->right);
            nodeCount--;
            totalNodeCount++;    // <--  Update this counter
        }
    }
}
  

再次,将此算法应用于非二叉树。

为此,请使用遍历每个子节点的循环替换下面给定的代码行,并将NON-NULL子节点推入队列。

if (node->left != NULL)
    q.push(node->left);
if (node->right != NULL)
    q.push(node->right);

答案 2 :(得分:1)

您正在寻找的有点像BFS。你只需像以下一样走你的树:

int getTotalCount(Element e) {
    int total_count = 0;
    for (Element child : e.children) {
        total_count += getTotalCount(el);
    }
    return total_count + 1;
}

同样,获取元素总数很容易:不是在节点的子节点中获得最大值,而是将它们添加起来。

{{1}}

如果必须使用相同的函数返回这两个数字,只需将它们打包在一个公共类中,只遍历一次树。

答案 3 :(得分:0)

谢谢你的回答。

这就是我编码的内容。

public static TreeData countElementsAndFindHeight(Element root) {
    TreeData treePair = new TreeData();
    if (root == null) {
        return treePair;
    }

    treePair.nElements = 1;
    treePair.height = 1;

    //Nodes queue will contain all the elements of the trees, so its size is the number of elements.
    List<Element> nodesQueue = new LinkedList<Element>();

    treePair.walkedNodes = nodesQueue;

    List<Element> children = root.getChildren();
    if (CommonUtils.isCollectionEmpty(children)) {
        return treePair;
    }

    treePair.height = countElementsAndFindHeight(root, nodesQueue);
    nodesQueue.add(root);
    treePair.nElements = nodesQueue.size();

    return treePair;
}


private static int countElementsAndFindHeight(Element root, List<Element> nodesQueue) {
    int maxHeight = 1;
    List<Element> children = root.getChildren();
    if (CommonUtils.isCollectionEmpty(children)) {
        return maxHeight;
    }

    for (Element childElement : children) {
        int childHeight = countElementsAndFindHeight(childElement, nodesQueue);
        if (childHeight > maxHeight) {
            maxHeight = childHeight;
        }
        nodesQueue.add(childElement);
    }

    return maxHeight + 1;
}

public static class TreeData {

    protected int height = 0;
    protected int nElements = 0;
}