如何为 return 节点自定义对象创建 C++ 递归函数?
how to create a c++ recursive function to return a node custom object?
你好吗?
我创建了一个 C++ 递归函数以遍历二叉树并打印出 属性 COMPLETED = TRUE;[=13= 的所有节点]
它工作得很好,因为函数的类型是 VOID,我只打印出结果。
这是行之有效的方法:
void findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return;
}
if (lastNode->completed == true) {
cout << lastNode->word.morseWordElement << endl;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
但我想做的是 return 第一个找到的“已完成” node 而不是打印!
我试过这种方法,但没有用:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
感谢您的帮助。
菲利普
不确定你想要什么,但我怀疑你正在寻找
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == nullptr){
return nullptr;
}
if (lastNode->completed == true) {
return lastNode;
}
auto pnt = findAndPrintFirstCompletedNodes(lastNode->left);
if ( nullptr == pnt ) {
pnt = findAndPrintFirstCompletedNodes(lastNode->right);
}
return pnt;
}
您似乎不熟悉 returning 值的工作原理。
行的结果
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
在您的代码中被忽略。
只有在第一个递归中输入完成的情况下,任何东西都是returned。坦率地说,我想知道为什么你的编译器没有警告你。
我认为您的错误在于您假设递归调用中的 return 会导致原始调用也为 return。它没有。它产生一个值,然后被忽略。
看下面的代码:
int four()
{
return 4;
}
int three()
{
four();
return 3;
}
当您调用 three()
时,这里发生的事情是创建一个值为 4 的整数,然后丢弃,然后 return 编辑值 3。 three()
不 return 4.
试试这个:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
if(node) return node;
return nullptr;
}
在这里,我将递归调用的return值存储在变量node
中,并return它以防它不是空指针,使用空指针作为“未找到”。
如果当前节点既不完整也没有在递归调用中找到任何东西,我因此 return 一个空指针。
您可以将其缩短为
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
return node;
甚至
treeNode* node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
return findAndPrintFirstCompletedNodes(lastNode->right);
但我选择了上面的版本,因为它应该更好地说明这一点。
顺便说一下,我建议用
if (lastNode == 0){
return 0;
}
你一起去
if (not lastNode){
return nullptr;
}
或
if (lastNode == nullptr){
为了明确我们使用的是指针。
你好吗?
我创建了一个 C++ 递归函数以遍历二叉树并打印出 属性 COMPLETED = TRUE;[=13= 的所有节点]
它工作得很好,因为函数的类型是 VOID,我只打印出结果。
这是行之有效的方法:
void findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return;
}
if (lastNode->completed == true) {
cout << lastNode->word.morseWordElement << endl;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
但我想做的是 return 第一个找到的“已完成” node 而不是打印!
我试过这种方法,但没有用:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
感谢您的帮助。
菲利普
不确定你想要什么,但我怀疑你正在寻找
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == nullptr){
return nullptr;
}
if (lastNode->completed == true) {
return lastNode;
}
auto pnt = findAndPrintFirstCompletedNodes(lastNode->left);
if ( nullptr == pnt ) {
pnt = findAndPrintFirstCompletedNodes(lastNode->right);
}
return pnt;
}
您似乎不熟悉 returning 值的工作原理。 行的结果
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
在您的代码中被忽略。 只有在第一个递归中输入完成的情况下,任何东西都是returned。坦率地说,我想知道为什么你的编译器没有警告你。
我认为您的错误在于您假设递归调用中的 return 会导致原始调用也为 return。它没有。它产生一个值,然后被忽略。
看下面的代码:
int four()
{
return 4;
}
int three()
{
four();
return 3;
}
当您调用 three()
时,这里发生的事情是创建一个值为 4 的整数,然后丢弃,然后 return 编辑值 3。 three()
不 return 4.
试试这个:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
if(node) return node;
return nullptr;
}
在这里,我将递归调用的return值存储在变量node
中,并return它以防它不是空指针,使用空指针作为“未找到”。
如果当前节点既不完整也没有在递归调用中找到任何东西,我因此 return 一个空指针。
您可以将其缩短为
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
return node;
甚至
treeNode* node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
return findAndPrintFirstCompletedNodes(lastNode->right);
但我选择了上面的版本,因为它应该更好地说明这一点。
顺便说一下,我建议用
if (lastNode == 0){
return 0;
}
你一起去
if (not lastNode){
return nullptr;
}
或
if (lastNode == nullptr){
为了明确我们使用的是指针。