二叉树 - 查找深度均匀的叶子数的算法

时间:2017-04-17 18:56:05

标签: algorithm

问题如下:

  

找到一个算法,该算法获取指向二叉树的指针(到它的开头),并返回均匀深度(级别)的叶子数。

在此示例中,算法将返回2,因为我们不会计算级别1中的叶子(因为1不是偶数)。

我想我需要一个递归算法。如果我传递两个我在函数中传递的参数(pointer to a treelevel),这很容易。 我想知道我是否只能通过指针解决它,没有关卡。

2 个答案:

答案 0 :(得分:1)

考虑一个函数 f ,它在树中以递归方式下降。你必须区分三种情况:

  1. 您当前的节点没有子节点,其深度是均匀的。你返回1。
  2. 您当前的节点没有子节点,其深度为奇数。你返回0。
  3. 您当前的节点有子节点。您将返回这些子项上 f 的所有递归调用的总和。
  4. 您必须自己定义 f

    不,不可能只用一个参数定义 f 。您必须记住当前节点以及实际深度。递归算法本质上不知道它们被称为的位置。当然(但不推荐),只要不并行化 f ,就可以在静态变量中记住后者。

    此外,你可以“覆盖” f 它只需要一个参数并调用函数 f 获取两个参数,当前深度设置为0。

答案 1 :(得分:0)

实际上,您只需使用一个周长即可解决问题。但是在这种情况下,您需要两个小辅助函数:

typedef struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

int countForOdd(TreeNode*);
int countForEven(TreeNode*);
int count(TreeNode*);

//If the TreeNode to be passed as perimeter is at an odd level, call this function
int countForOdd(TreeNode *node)
{
    if(!node) return 0;
    return countForEven(node->left)
        + countForEven(node->right);
}
    //If the TreeNode to be passed as perimeter is at an even level, call this function
int countForEven(TreeNode *node)
{
    if(!node) return 0;
    return 1 + countForOdd(node->left)
        + countForOdd(node->right);
}

//And finally, our specific function for root is:
int count(TreeNode* root)
{
    return countForOdd(root);
}