平衡树递归:为什么我的解决方案难以忍受?

时间:2014-10-16 07:13:14

标签: c recursion tree

原点问题是:

将二叉树的高度定义为从根到叶子的最长路径中的节点数。空树被认为具有高度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的新手,这是我在这里的第一个问题。任何提示或解释都会受到赞赏。

0 个答案:

没有答案