当前位置: 首页 > 知识库问答 >
问题:

二叉树的最小高度?

裴欣荣
2023-03-14

我在阅读下面的帖子后提出这个问题:

如何找到树的最小可能高度?

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

但是下面的代码只返回1,因为它不区分叶[left==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-

这棵树看起来像这样-

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

我需要找出根节点和叶节点之间的最短距离[100-

这是我的密码-

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个答案

庞书
2023-03-14
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);
}
吕宸
2023-03-14

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

因此,与其选择根下两个子树的最小高度(minDepth函数),不如求其大小之和。

如果节点不为null(实际上根本不是节点,也不应计算),则以下函数将左、右子树的大小加一。

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,2}的最小深度是多少 根据我的解决方案,应该是1。

  • 如何在二叉树中找到最小路径和,并打印路径?路径可以从ROOT节点到任何LEAF节点。我已经编写了C代码来查找最小和,但是在打印路径时遇到了问题。 参数列表中的未使用,有人能帮我打印路径和最小的路径吗?

  • 我正在处理LeetCode问题111。二叉树的最小深度: 给定一棵二叉树,求其最小深度。 最小深度是从根节点到最近的叶节点的最短路径上的节点数。 注意:叶是没有子节点的节点。 我使用了广度优先的算法,并试图改变它以使其与问题保持一致。但是函数返回的是。 有人能解释为什么会这样吗?

  • 这总是使只有一个out的循环: 为了返回二叉树的正确高度,您还有其他想法(或想法如何更改此代码)吗? len是树中所有节点的数目,self。Queue是具有方法高度的类的子类。

  • 我需要关于计算二叉树高度的理论的帮助,通常是符号。 我看过以下文章: 计算二叉树的高度 其中一个帖子给出了以下符号: 高度(节点)=最大值(高度(节点L)、高度(节点R))1 假设我有以下二叉树: 因此,我是否计算左节点(8)和右节点(42)的最大值,然后加上1?我不太明白这种符号是如何计算树的高度的。

  • 我试图递归地在二叉树中找到最小值(不是二叉查找树)。让我困惑的是基本情况。如果TreeNode t为空,返回什么?因为我将使用返回的值将其与当前的最小值进行比较(我认为),我相信我返回的内容很重要。