我试图在二叉树中打印所有根到叶子路径的代码。
group by
代码给出了分段错误,因为终止条件存在一些问题。 有人可以帮助我解决问题。
答案 0 :(得分:2)
这种做法过于复杂,而且很脆弱。
此处不需要单独的堆栈。
此处不需要单独的“可见”数组。
所需要的只是一个递归下降到这个树的股票递归访问者,它还为一个动态构建在堆栈上的结构提供了一个额外的参数,该结构使用链接列表构建到运行中的根路径。是这样的:
struct path_to_root {
struct path_to_root *next;
struct node *n;
};
现在,打印每个叶子音符的路径所需要的只是一个沼泽标准的访问者,它递归地迭代树和这个附加参数。以下是一般方法的粗略概念:
void printpath(struct node *n, struct path_to_root *p)
{
struct path_to_root pnext;
if (!n)
return;
if (!n->left && !n->right)
{
/* Your homework assignment here is to print the path that's in "p" */
}
pnext.n=n;
pnext.next=p;
printpath(n->left, &pnext);
printpath(n->right, &pnext);
}
这将被调用为:
printpath(root, NULL);
如上所述,您的家庭作业将在指定的空白处使用p
参数实现打印叶子路径的实际代码。此时,叶子的路径将在p
参数中找到。
现在,这里有一个棘手的部分:p
将是叶子的父亲,p->next
将是其祖父母,等等。所以路径是从底部到顶部,而不是从上到下,但这是一个小细节,可以在打印代码中处理。
或者,或者,以相同的方式动态构建从上到下的叶子路径也不会太多额外的工作。