问题如下:
找到一个算法,该算法获取指向二叉树的指针(到它的开头),并返回均匀深度(级别)的叶子数。
在此示例中,算法将返回2,因为我们不会计算级别1中的叶子(因为1不是偶数)。
我想我需要一个递归算法。如果我传递两个我在函数中传递的参数(pointer to a tree
和level
),这很容易。
我想知道我是否只能通过指针解决它,没有关卡。
答案 0 :(得分:1)
考虑一个函数 f ,它在树中以递归方式下降。你必须区分三种情况:
您必须自己定义 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);
}