c++ 计算树的高度

fdbelqdn  于 2022-11-27  发布在  其他
关注(0)|答案(5)|浏览(357)

我正在试着计算一棵树的高度。我正在用下面写的代码做这件事。

#include<iostream.h>

struct tree
{
    int data;
    struct tree * left;
    struct tree * right;
};

typedef struct tree tree;

class Tree
{
private:
    int n;
    int data;
    int l,r;
public:
    tree * Root;
    Tree(int x)
    {
        n=x;
        l=0;
        r=0;
        Root=NULL;
    }
    void create();
    int height(tree * Height);

};

void Tree::create()
{
    //Creting the tree structure
} 

int Tree::height(tree * Height)
{
    if(Height->left==NULL && Height->right==NULL)
    {return 0;
    }
    else
    {
        l=height(Height->left);
        r=height(Height->right);

        if (l>r)
        {l=l+1;
        return l;
        }
        else
        {
            r=r+1;
            return r;
        }
    }
}

int main()
{
    Tree A(10);//Initializing 10 node Tree object
    A.create();//Creating a 10 node tree

    cout<<"The height of tree"<<A.height(A.Root);*/

}

它给了我正确的结果。
但是在some posts(谷歌页面)中,建议做一个Postorder遍历,并使用这个高度方法来计算高度。

af7jpaap

af7jpaap1#

但是,后序遍历不正是你所做的吗?假设left和right都是非空的,你首先做height(left),然后是height(right),然后是当前节点的一些处理。这就是我所说的后序遍历。
但我会这样写:

int Tree::height(tree *node) {
    if (!node) return -1;

    return 1 + max(height(node->left), height(node->right));
}

编辑:根据定义树高度的方式,基本情况(对于空树)应为0或-1。

11dmarpk

11dmarpk2#

如果树中至少有一个节点只有一个子节点,则代码将失败:

// code snippet (space condensed for brevity)
int Tree::height(tree * Height) {
    if(Height->left==NULL && Height->right==NULL) { return 0; }
    else {
        l=height(Height->left);
        r=height(Height->right);
//...

如果树有两个节点(根节点和左或右子节点),在根节点上调用方法将不满足第一个条件(至少一个子树为非空),它将递归调用两个子节点。其中一个子节点为null,但它仍将解引用null指针以执行if
Hans在这里给出了一个正确的解决方案。无论如何,你必须选择你的方法不变量是什么:要么允许参数为空的调用并妥善处理,要么要求参数为非空并保证不使用空指针调用方法。
如果您不控制所有的入口点(方法在您的代码中是公共的),第一种情况会更安全,因为您不能保证外部代码不会传递空指针。如果您可以控制所有的入口点,第二种解决方案(将签名改为引用,并使其成为tree类的成员方法)可能会更干净(或不干净)。

11dmarpk

11dmarpk3#

树的高度不会随着遍历而改变,它保持不变,而是节点的顺序随着遍历而改变。

tez616oj

tez616oj4#

wikipedia中的定义。
前序(深度优先):
1.访问根。
1.遍历左子树。
1.遍历右子树。
顺序(对称):
1.遍历左子树。
1.访问根。
1.遍历右子树。
发布者:
1.遍历左子树。
1.遍历右子树。
1.访问根。
定义中的“访问”意味着“计算节点的高度”。在你的例子中,它要么是零(左边和右边都是空的),要么是1 +子节点的合并高度。
在你的实现中,遍历顺序并不重要,它会给予相同的结果。如果没有一个指向你的源代码的链接,你真的不能告诉你更多的东西。

rsaldnfx

rsaldnfx5#

下面是答案:

int Help :: heightTree (node *nodeptr)
{
    if (!nodeptr)
        return 0;
    else
    {
        return 1 + max (heightTree (nodeptr->left), heightTree (nodeptr->right));
    }
}

相关问题