我接受了采访,但我无法回答这个问题。您有一个二叉树,并且您使用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语句中写的内容,但我写的内容是错误的。
答案 0 :(得分:7)
猜测所有遗漏的细节,我认为你会做的事情如下:
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%确定它的定义很好!)而我真的希望他们不是在寻找这样的解决方案!< / p>
答案 1 :(得分:0)
有序是树遍历的一种方法;你从左到右依次旅行节点(因此名称)。
因此,对于插入部分,您将所有节点插入当前节点的左侧,插入当前节点,然后将所有节点插入右侧。
在in_order(node->right,array)
电话之后,您会返回您的值(您的问题描述不清楚您应该返回的确切内容)。
答案 2 :(得分:0)
对于inorder遍历:
在您的情况下,“访问”表示将当前节点添加到列表中,然后碰撞计数器。
至于将元素放入数组中,就个人而言,我会使用一个向量(如果绝对必要的话,最后转换/复制到数组中)。您可以在“开始”函数中创建它,然后调用递归函数,或在调用者中创建它。无论哪种方式,您都会在每次调用中传递对它的引用。最后,您同时拥有一组节点值和计数。否则你最终不得不通过树一次计算元素,第二次收集它们。 (或者您可以将引用或指针传递给指针,因此您可以根据需要重新分配,但这会变得很难看。无论哪种方式,我都不相信调用者知道有多大的数组给你 - 这是你的工作知道/计算树的大小。:P)