- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的程序中,我有一个定义如下的二叉树:
struct node {
char value;
struct node *left, *right;
};
在我的程序中,我试图编写一个函数,该函数按索引顺序(从上到下,从右到左遍历)返回每个节点值的字符串。
为了尝试这样做,我编写了以下函数:
char *to_string_util(struct node *root, char *str) {
if (!root) return str;
*str++ = root->value;
// If not NULL
if (root->left) to_string_util(root->left, str);
if (root->right) to_string_util(root->right, str);
return str;
}
这似乎应该有效,但遗憾的是,它没有。我已经通过使用数组索引让它工作了,它工作但不受欢迎,因为它需要引入另一个变量。
这是有效的版本:
char *to_string_util(struct node *root, char *str, int *cur_pos) {
if (!root) return str;
str[(*cur_pos)++] = root->value;
if (root->left) to_string_util(root->left, str, cur_pos);
if (root->right) to_string_util(root->right, str, cur_pos);
return str;
}
给定树:
+
/ \
* *
/ \ / \
a a b b
结果应该是:+*aa*bb
需要注意的一件事是,我在另一个函数中调用了这个函数,该函数在它的末尾附加了一个空字符,这应该不会影响输出,但我认为可能值得一提。
为什么使用数组索引的第二个版本有效,而第一个版本却不行?
最佳答案
它不起作用,因为您忽略了从递归子调用返回的 str
的新值。您的函数旨在更新 str
的值并通过执行 return str;
返回新值。而您只是丢弃了返回值。因此,在每个递归级别,对右子树的调用都会覆盖对左子树的递归调用所写入的数据。
这可能更接近你的想法
// If not NULL
if (root->left) str = to_string_util(root->left, str);
if (root->right) str = to_string_util(root->right, str);
当然,您应该记得在最后以零终止您的字符串。
如果你的函数以
开头if (!root) return str;
那么递归子调用实际上不需要空检查,可以简化为
str = to_string_util(root->left, str);
str = to_string_util(root->right, str);
(除非您将其视为优化)。
您的基于索引的版本不再依赖于 str
的更新(并且根本不更新它)。这取决于位置值 *cur_pos
的更新。由于位置值是在不同级别的递归之间通过引用传递的,因此所有级别的递归都会看到这些更新。
您也可以在第一个版本中使用相同的技术,即通过引用传递您的指针值。但是为此,您必须将 str
作为 char **str
(指向指针的指针)传递并使用 *str
和当前字符指针。
关于c - 为什么这个指针运算不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45602871/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!