如何计算树的高度

时间:2017-02-16 09:23:46

标签: algorithm data-structures tree

我正在尝试学习DSA并遇到一个问题。

如何计算树的高度。我指的是普通树,而不是像BT或BST这样的树的任何具体实现。

我试过谷歌,但似乎每个人都在谈论二叉树,没有什么可用于普通树。

任何人都可以帮我重定向到一些页面或文章来计算树的高度。

3 个答案:

答案 0 :(得分:3)

假设树中的典型节点表示为Java类。

class Node{
    Entry entry;
    ArrayList<Node> children;
    Node(Entry entry, ArrayList<Node> children){
        this.entry = entry;
        this.children = children;
    }   
    ArrayList<Node> getChildren(){
        return children;
    }   
}  

然后一个简单的高度函数可以是 -

int getHeight(Node node){
    if(node == null){
        return 0;
    }else if(node.getChildren() == null){
        return 1;
    } else{
       int childrenMaxHeight = 0;
       for(Node n : node.getChildren()){
           childrenMaxHeight = Math.max(childrenMaxHeight, getHeight(n));
       }
       return 1 + childrenMaxHeight;
    }
}

然后你只需要调用这个函数传递树的根作为参数。由于它只遍历所有节点一次,因此运行时间为O(n)。

答案 1 :(得分:0)

如果是普通树&#39;您可以以类似于二叉树的方式递归计算树的高度,但在这里您必须考虑节点上的所有子节点而不是仅仅两个节点。

答案 2 :(得分:0)

要查找树高,BFS迭代将正常工作。

维基百科编辑:

Breadth-First-Search(Graph, root):

    create empty set S
    create empty queues Q1, Q2    

    root.parent = NIL

    height = -1

    Q1.enqueue(root)                      
    while Q1 is not empty:

        height = height + 1
        switch Q1 and Q2

        while Q2 is not empty:
            for each node n that is adjacent to current:
                if n is not in S:
                    add n to S
                    n.parent = current
                    Q1.enqueue(n)

您可以看到添加另一个队列可以让我知道树的级别。 它针对每个级别以及该级别中的每个模式进行迭代。

这是一种方法(与递归相反)。因此,您也不必担心这一点。

运行时间为O(| V | + | E |)。