原点问题是:
将二叉树的高度定义为从根到叶子的最长路径中的节点数。空树被认为具有高度0.如果节点的左右子树的高度最多为k,则该节点是k平衡的。如果树的所有节点都是k平衡的,则树是k平衡的。空树被认为是k平衡的。
例如,下面的树的高度为4.
o
/ \
o o
/ \
o o
/
o
这棵树是2平衡的但不是1平衡的,因为根的左子树的高度为3,根的右子树的高度为1。 您的任务是编写一个方法,该方法采用平衡因子k和多个节点n,并返回具有n个节点的k平衡树的最大高度。
答案之一(正确和快速)是:
int fewest_node(int k,int h)
{
if(h <= 0)
return 0;
return 1+fewest_node(k,h-1)+fewest_node(k,h-1-k);
}
int maxHeight2(int k, int n)
{
for(int h = 1;;h++)
if(fewest_node(k,h) > n)
return h - 1;
}
,我的解决方案(非常慢)是:
int maxHeight(int k, int n)
{
int i,left,right;
if(k >= n)
return n;
if(n > 2)
{
left = maxHeight(k,n-1);
if(left <= k)
return left+1;
else
{
i = n - 2;
left = maxHeight(k,i);
right = maxHeight(k,n-1-i);
while((left - right) > k)
{
i--;
left = maxHeight(k,i);
right = maxHeight(k,n-1-i);
}
return left+1;
}
}
else
return n;
}
我的问题:
1.我的解决方案是对的吗?我的意思是它无论效率如何都能正常工作?或者换句话说,逻辑是正确的吗?(顺便说一句,我认为这是对的,当n小于30时我测试了输出)
2.为什么我的解决方案太慢了? 正如你所看到的,我是DSA的新手,这是我在这里的第一个问题。任何提示或解释都会受到赞赏。