我在阅读以下帖子后问这个问题:
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;
}
答案 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);
}