二叉树的最小高度?

时间:2014-10-14 17:41:04

标签: c++ c data-structures tree binary-tree

我在阅读以下帖子后问这个问题:

How to find minimum possible height of tree?

实际上,如果给二叉树的输入如下,我希望我的算法返回4:100,50,70,60。

但是下面的代码只返回1,因为它没有区分叶子[left == NULL&& right == NULL]和只有一个孩子的节点。

int minDepth(TreeNode root)  {
    if (root == null) { 
        return 0;
    }
    return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}

如果我们希望输出为4而不是1,则没有人解释我们应该怎么做。

任何人都可以告诉我返回4而不是1的代码吗?

我认为我选择了错误的样本值,人们对我实际需要的内容感到困惑!所以,重新构建我的问题如下:

假设任何节点都可以有0,1或2个子节点。请考虑此样本输入 - 100,50,150,30,70,200,20,40,60,80,10。现在我希望我的功能将高度返回为3 [100-> 150-> 200] 。我将此分支称为[100-> 150-> 200]作为树的最小高度。在最小高度的类比中我可能是错的但是我想要的只是返回3.

树看起来像这样 -

                        100
                      /     \\
                     /       \\
                  50          150
                 /   \           \\
              30       70         200
              / \     /  \
            20  40   60  80
           /
          10

我需要找出根节点和叶节点之间的最短距离[100-> 150-> 200] = 3.

这是我的代码 -

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

void add(struct node** root, int data)
{
    if(*root == NULL)
    {
        (*root) = (struct node*)malloc(sizeof(node));
        (*root)->left = NULL;
        (*root)->right = NULL;
        (*root)->data = data; 
    }
    else
    {
        if(data < (*root)->data )
            add(&(*root)->left, data);
        else
            add(&(*root)->right, data);
    }

}

void inorder(struct node* root)
{
    if(root == NULL)
        return;
    inorder(root->left);
    cout<<root->data<<" ";
    inorder(root->right);
}

int minDepth(struct node* root)  
{
    if (root == NULL) 
    { 
        return 0;
    }
    return 1 + min(minDepth(root->left), minDepth(root->right));
}

int main()
{
        struct node* root = NULL;
        add(&root, 100);
        add(&root, 50);
        add(&root, 150);
        add(&root, 30);
        add(&root, 70);
        add(&root, 200);
        add(&root, 20);
        add(&root, 40);
        add(&root, 60);
        add(&root, 80);
        add(&root, 10);
        inorder(root);
        cout<<endl;
        int i = minDepth(root);
        cout<<i<<endl; // this should be 3
        getchar();
        return 0;
}

2 个答案:

答案 0 :(得分:3)

在我看来,你想知道树的大小而不是它的高度。

因此,不要选择根目录下的两个子树的最小高度(minDepth函数),而是要将它们的大小相加。

如果节点不为空(如果节点根本不是一个节点且不应计算),则以下函数会将左右子树的每个子节点的大小加1:

int sizeOfTree(TreeNode root){
    if (root == nulll) {return 0;}
        return 1 + sizeOfTree(root.left) + sizeOfTree(root.right);
}

递归地,这将找到树中的节点数(也称为它的大小)。

编辑:问题经过审核后,我认为这就是你想要的:

int shortestBranch(TreeNode root){
    if (root == null) {return 0;}
    if (root.left == null && root.right == null){
        return 1;
    } else if (root.left == null) {
        return 1 + shortestBranch(root.right);
    } else if (root.right == null) {
        return 1 + shortestBranch(root.left);
    } else {
        return 1 + Math.min(shortestBranch(root.right), shortestBranch(root.left));
    }
}

答案 1 :(得分:1)

int minDepth( TreeNode root )
{
    if( root == null )
        return 0;
    if( root.left == null && root.right == null )
        return 1;
    int l = minDepth(root.left);
    int r = minDepth(root.right);
    if( l == 0 )
        return r;
    if( r == 0 )
        return l;
    return 1 + Math.min(l,r);
}