c - 在递归函数中返回和使用多个树结构

标签 c recursion tree traversal

我有一个函数 get_trees(),它对复杂的树结构 T 进行操作并返回两个组件树结构 A 和 B。我能够使其工作的唯一方法是创建一个新的结构 C,其中的指针指向A 和 B,然后作为参数传递给函数,同时也是返回值:

typedef struct Composite {
itree *A;
itree *B; 
} composite;

composite *get_trees(complextree *T, itree *A, itree *B, composite *C);

树 A 和 B 的根节点在另一个函数中初始化:

itree *A = new_itree(0);
itree *B = new_itree(0);
A->n     = T->a;
B->n     = T->b;
composite *C;
C = get_trees(T, A, B, C);

get_trees() 沿着复杂树 T 的分支向下走,分配并填充 A 和 B 的节点,并在子节点上递归地调用自身。简化代码:

//code for allocating subnodes of A and B     
if (T->nodes != NULL){
    for (i=0; i< T->nn; i++){
    //code for computing p & q
    C = get_trees(T->nodes[i], A->nodes[p], B->nodes[q]);
    }
}

代码运行良好。不过看起来很丑。

(1) C 没有内在含义,即用于允许返回多个值。还有其他选择吗?大致如下:

(2)是否可以编写具有以下签名的递归函数:

void get_trees(T, A, B);

似乎如果我将 A 和 B 的根节点作为参数传递,并且子节点在递归函数内分配,那么可以说存在一个连续的命令链,并且当递归调用完成时整个树应该可用。它对我不起作用,所以一定不允许。如果有人能解释为什么会出现这种情况,或者是否可以有更优雅的解决方案,我将不胜感激?

谢谢,节日快乐。 〜RT

最佳答案

您所做的是将多个指针值作为函数的返回值返回的唯一方法。但这不被认为是好的形式。

好的形式是声明您的函数具有输出参数和输入参数,并使用返回值来指示成功或失败。像这样

bool get_trees(complextree *T, itree *A, itree *B, composite *C, itree ** AOut, itree** BOut); 

关于c - 在递归函数中返回和使用多个树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964820/

相关文章:

c - 根据现在的时间运行 func()

r - 使用 shift() 进行递归在 data.table 中生成多列

javascript - 递归地重新创建嵌套对象数组

c++ - 尝试在 cpp 中打印 n 维数组

java - 创建家谱树java

mysql - 嵌套集模型维护

c++ - 如果我想将一个无符号整数四舍五入为最接近的更小或相等的偶数,我可以除以 2 然后乘以 2 吗?

将 unix 时间转换为日期

c - free() 没有正确释放内存?

java - 确定树结构中所有节点值的平均值