【发布时间】:2021-10-16 01:16:37
【问题描述】:
我想编写一个递归搜索树,寻找具有适当数据的节点,然后返回节点本身。我需要节点本身,因为然后我将使用该节点继续构建树。我已经尝试过这个函数的许多版本,但下面的代码是我最接近的。请注意,我将一般树表示为二叉树,如 here 所述,因此我认为出于所有意图和目的,这可以视为二叉树。
struct node {
int id;
struct node *firstChild;
struct node *nextSibling;
};
struct node* findNode(struct node* node, int id) {
if (node->id == id)
return node;
if (node->firstChild != NULL)
return findNode(node->firstChild, id);
if (node->nextSibling != NULL)
return findNode(node->nextSibling, id);
return node;
}
我了解此代码的问题:如果存在左(子)分支并且所需的节点不在该分支中,则它返回该分支的叶子而不是探索右分支。我知道我的代码有太多的返回语句;我尝试了其他回报较少的版本,但没有找到有效的功能。
提前致谢。
【问题讨论】:
-
当你说“返回节点本身”时,你的意思是它按值返回(副本)节点,还是从树中删除节点并返回它?或者它返回一个指向节点的指针?
-
@Beta 或者他们可能意味着它返回节点并且喜欢......不会将它从树中删除,因为为什么会这样。而且这个函数似乎被设计成返回一个指针,而不是一个副本。
-
好问题。我想我的意思是它应该按值返回节点。我不希望从树中删除节点;我想在节点上构建。所以我想我正在尝试在内存中找到节点的位置,以便我可以在此基础上进行构建。
-
PS 此外,给 struct 和 variable 赋予相同的名称会使您的代码 - 以及任何尝试谈论它——非常神秘。并且给 pointer 起一个暗示非指针的名称...使用更好的名称,伙计。
-
这就是我的理解:按值/按副本返回将返回
struct node。指针返回将返回一个struct node*。后者允许您访问 您找到的节点 并直接更改结构中的数据。在 C++ 中也有按引用返回,它返回struct node&并且工作方式类似于按指针返回,除了代码看起来像按值/复制返回,也就是说,没有取消引用。它是语法糖。诚然,这可能有点令人困惑,但你很快就会掌握它。
标签: c algorithm binary-tree