C++ 在处理N元树遍历时,我完全被卡住了

C++ 在处理N元树遍历时,我完全被卡住了,c++,algorithm,C++,Algorithm,事情是这样的。我想遍历我的N元树(在本例中为家族树)中的任意两个节点。下面是我从根遍历到任意节点的简化代码: #include <iostream> #include <string> using namespace std; const int max=100; //structure definition //every children has only one parent struct Tree { string name; int numChi

事情是这样的。我想遍历我的N元树(在本例中为家族树)中的任意两个节点。下面是我从根遍历到任意节点的简化代码:

#include <iostream>
#include <string>
using namespace std;

const int max=100;

//structure definition
//every children has only one parent
struct Tree {
   string name;
   int numChildren;
   Tree *children[max];
   ~Tree(){delete [] children;}
}; 

//Label the nodes that are supposed to be in the path
//Suppose the names of those nodes do not contain whitespaces,just trivial names
int *travel_point(Tree *tree,string s){
    Tree *node = new Tree;
    Tree *temp = new Tree;
    node = tree;

    int a[100],i=0,j;
    for(j=0;j<100;j++) a[j]=-1;
    while(tree){
        if(tree->name == s){
           a[i]=0;
           break;
        }
        else{
           for(j=0;j<node->numChildren;j++){
              if(travel_point(node->children[j],s)!=NULL){
                break;      
                }
              }
           a[i]=j+1;
           i++;
           temp=node->children[j];
           node=temp;
        }
    }
    if(a[i-1]==-1) return NULL;
    else a;
}
#包括
#包括
使用名称空间std;
常数int max=100;
//结构定义
//每个孩子只有一个父母
结构树{
字符串名;
国际儿童;
树*children[max];
~Tree(){delete[]子项;}
}; 
//标记应该位于路径中的节点
//假设这些节点的名称不包含空格,只包含普通名称
int*行程点(树*树,字符串s){
树*节点=新树;
树*temp=新树;
节点=树;
int a[100],i=0,j;
对于(j=0;jname==s){
a[i]=0;
打破
}
否则{
对于(j=0;jnumChildren;j++){
if(行程点(节点->子节点[j],s)!=NULL){
打破
}
}
a[i]=j+1;
i++;
temp=节点->子节点[j];
节点=温度;
}
}
如果(a[i-1]=-1)返回NULL;
否则a;
}
这大概就是我一直在做的。因为每个子节点只有一个父节点,那么从根节点到任意节点的路径也是唯一的。所以我想将所有其他路径设置为NULL,以便在递归过程中利用


我知道递归不是一个好主意,但我只是想尝试一下。

这会崩溃和烧坏的。您正在返回指向临时数组“a”的指针。也许您打算将“a”作为参数传递给函数。但是:函数应该返回什么


顺便说一下:递归是个好主意

这将崩溃并燃烧。您正在返回指向临时数组“a”的指针。也许您打算将“a”作为参数传递给函数。但是:函数应该返回什么


顺便说一下:递归是个好主意

好的,我不想解决你的家庭作业,但我想给你一些建议。 首先,带树的递归函数通常是好的,通常树的高度不会太深,所以递归函数是好的。它们更容易书写和理解

1) 不能返回指向堆栈内存中数组的指针并假装它可以工作:)

2) 您需要一个stack类,使用
std::stack
,将一个非常量引用作为参数传递给它,这样您就可以在所有函数中修改它,并返回一个布尔值,指示是否找到节点。然后可以将堆栈转换为向量或数组,但正如我想象的那样,算法需要堆栈数据结构

3) 无需通过副本传递字符串,只需传递一个常量引用即可。(常量字符串和s)

4) 算法错误,请重写它。多想想

5) 析构函数是错误的,它不会杀死子节点,但会执行无效的释放,您需要一个循环

6) 我将使用
std::vector

我把这个函数想象成

bool travel_point(const Tree *tree, const string& s, stack<int>& result)
bool-travel\u点(常数树*树、常数字符串和序列、堆栈和结果)
使用它

stack<int> path;
if (travel_point(mytree, "ciao", path))
{
    // print path
}
堆栈路径;
if(行程点(mytree,“ciao”,路径))
{
//打印路径
}

好的,我不想解决你的家庭作业,但我想给你一些建议。 首先,带树的递归函数通常是好的,通常树的高度不会太深,所以递归函数是好的。它们更容易书写和理解

1) 不能返回指向堆栈内存中数组的指针并假装它可以工作:)

2) 您需要一个stack类,使用
std::stack
,将一个非常量引用作为参数传递给它,这样您就可以在所有函数中修改它,并返回一个布尔值,指示是否找到节点。然后可以将堆栈转换为向量或数组,但正如我想象的那样,算法需要堆栈数据结构

3) 无需通过副本传递字符串,只需传递一个常量引用即可。(常量字符串和s)

4) 算法错误,请重写它。多想想

5) 析构函数是错误的,它不会杀死子节点,但会执行无效的释放,您需要一个循环

6) 我将使用
std::vector

我把这个函数想象成

bool travel_point(const Tree *tree, const string& s, stack<int>& result)
bool-travel\u点(常数树*树、常数字符串和序列、堆栈和结果)
使用它

stack<int> path;
if (travel_point(mytree, "ciao", path))
{
    // print path
}
堆栈路径;
if(行程点(mytree,“ciao”,路径))
{
//打印路径
}

我不明白算法应该做什么,你能更好地解释一下吗?travel\u point做什么以及travel\u point返回什么?您的成员
子成员
不是分配给
新[]
的数组,您不能
删除[]
it.@chill我试图设置一个析构函数,以便递归删除所有树型结构的内容。那么正确的方法是什么?@SalvatorePreviti travel\u point查找节点是否位于我一直在寻找的路径上,并返回NULL或指向存储标签的数组的指针。标签是子数组的索引。然后我将能够按索引遍历路径。路径是什么?您的意思是要查找包含指定名称的节点的路径,将路径表示为整数序列?在这种情况下,这个函数是完全错误的:/我不明白算法应该做什么,你能更好地解释一下吗?travel\u point做什么以及travel\u point返回什么?您的成员
子成员
不是分配给
新[]
的数组,您不能
删除[]
it.@chill我试图设置一个析构函数,以便递归删除所有树型结构的内容。那么正确的方法是什么呢?@SalvatorePreviti travel\u point发现