在c++中使用递归返回一个值
Returning a value with recursion in c++
我有一个面试,我不能回答这个问题。你有一棵二叉树,你用in_order把所有的节点放到一个数组中,然后你返回数组大小的值。我被告知不能使用辅助函数并为数组计数器添加int I =0。
我必须使用的递归函数标题是。
In_order(Struct_Node * node, int *array){
}
因为我写的是In_order
if(node){
In_order(node->left, array);
//这一行是我应该添加元素并返回值的地方,但我不知道该怎么做。这是我的周点,我需要理解这段代码是如何工作的,而不是代码是什么。
in_order(node->right,array);
}
我实际上并没有写我在两个In_order语句之间写的东西,但是我写的是错误的
猜测所有遗漏的细节,我认为你会这样做:
int In_order(Struct_Node * node, int *array){
int count = 0;
if (node->left) {
count += In_order(node->left, array);
}
array[count++] = node->data; // whatever it is you're storing
if (node->right) {
count += In_order(node->right, array+count);
}
return count;
}
关键是你传递了一个更新的指针到RHS递归调用,你的返回值是1 + LHS return + RHS return
如果你不能使用int作为计数器(这很愚蠢,因为这是迄今为止最清晰的表达方式),你可以这样做:
int In_order(Struct_Node * node, const int *array){
int *tptr = array;
if (node->left) {
tptr += In_order(node->left, array);
}
*tptr++ = node->data; // whatever it is you're storing
if (node->right) {
tptr += In_order(node->right, tptr);
}
return tptr-array;
}
如果你想"有点"疯狂,避免函数参数以外的任何局部变量,你可以将返回类型更改为指向数组当前工作端的指针(这实际上也是数组的大小),并执行:
int *In_order(const Struct_Node * const node, int * const result) {
return !node ? result :
In_order(node->right, &(*In_order(node->left, result) = node->value)+1);
}
虽然老实说,这是很糟糕的代码(我甚至不能100%确定它是定义良好的!),我真的希望他们不是在寻找这样的解决方案!
In-order是一种树遍历方法;从左到右按顺序移动节点(因此得名)。
那么对于插入部分,您将插入当前节点左侧的所有节点,插入当前节点,然后插入所有节点到右侧。
在in_order(node->right,array)
调用之后,您返回您的值(您的问题描述不清楚您应该返回什么)。
对于无序遍历:
- 按顺序遍历左子树(如果有的话)。
- 访问当前节点
- 对右子树(如果有的话)进行无序遍历。
在您的示例中,"visit"意味着将当前节点添加到列表中,并碰撞计数器。
至于将元素放入数组,我个人会使用vector(然后在最后转换/复制到数组,如果绝对必要的话)。您可以在"start"函数中创建它,然后调用递归函数,或者在调用者中创建它。无论哪种方式,您都可以在每次调用中传递对它的引用。最后,您将获得节点值数组和计数。否则,您将不得不遍历树一次来计数元素,然后再遍历一次来收集元素。(或者您可以将引用或指针传递给指针,这样您就可以根据需要重新分配,但这会变得很难看。无论哪种方式,我都不相信调用者知道给你的数组有多大——你的工作是知道/计算出树的大小。:P)
- C++,class,一个返回对象的函数
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 两个相同的重载运算符[]一个返回引用
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 提升:创建一个返回变体的函数
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 我是否应该将最后一个“返回”语句封装为“else { return .. }',如果它在逻辑上是可选的
- 野牛解析器:创建一个返回令牌的函数
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 如何创建一个返回传递的参数名称的函数
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 将返回的指针分配给另一个返回的指针
- 如何声明一个返回类型是推导出来的函数
- Constexpr语言 - 为什么只是一个返回语句
- 如何创建一个返回护士函数的函数
- 如何用C包装一个返回智能指针的C++函数
- 如何使用两个函数,一个返回迭代器,另一个返回const_iterator