在 K&R 中找到的 C 问题中的二叉树实现
Posted
技术标签:
【中文标题】在 K&R 中找到的 C 问题中的二叉树实现【英文标题】:Binary tree implementation in C question as found in K&R 【发布时间】:2011-09-27 13:06:32 【问题描述】:所以我一直在阅读 K&R C 的书并有一个问题.. 在第 6 章第 140-141 页的结构中,有看起来像这样的代码(我去掉了一些更不相关的部分)
/*
the program loops through a tree looking for some word
if it finds the word itll incremenet the count by 1
if it doesnt itll add a new node
*/
struct node
char *word;
int count;
struct node *left;
struct node *right;
main()
struct node *root;
char word[1000];
root = NULL;
while(getword(word, MAXWORD) != EOF) /* getword just grabs 1 word at a time from a file of words */
if(isalpha(word[0])) /* isalpha checks to see if it is a valid word */
root = addNode(root, word);
treeprint(root); /* prints the tree */
return 0;
struct node *addNode(struct node *p, char *w)
int cond;
if(p == NULL)
p = malloc(sizeof(struct node)); /* allocates memory for the new node */
p -> word = strdup(w);
p -> count = 1;
p -> left = p -> right = NULL;
else if ((cond = strcmp(w, p -> word)) == 0)
p -> count++;
else if(cond < 0)
p -> left = addNode(p -> left, w);
else
p -> right = addNode(p -> right, w);
return p;
而我的困惑在于 root = addNode(root, word) 的 main() 函数
如果 addNode 返回一个指向新添加节点的指针(或者如果它已经在树中,则返回到该单词所在的节点),那不会“丢失”树上的所有数据吗?根不应该作为树的根吗?
谢谢!
【问题讨论】:
我在这里稍微描述了递归:***.com/questions/6420309/… 【参考方案1】:root
始终作为树的根。 root
作为addNode
的第一个参数传递,只有malloc
是NULL
,即当root
第一次传递时。在以后的调用中它不会更改root
,只会修改count
、left
或right
。请注意,在递归 addNode
调用中,p
没有传递,而是传递了它的左或右孩子。试着用纸和铅笔/钢笔穿过树,你会意识到节点是如何被添加的。
【讨论】:
【参考方案2】:您的误解在于addNode
的行为。它确实 not 返回指向新添加节点的指针;相反,它返回一个指向传入节点的指针,p
(除非是 NULL
)。
因为root == NULL
唯一一次是在添加第一个单词时,所以root
从那时起将具有相同的值,并且一遍又一遍地被赋予相同的值。这只是处理空树的一种优雅方式,由NULL
指针表示。
请记住,addNode
的每个递归调用对于p
都有一个不同 值。这就是局部变量的工作方式;它们是函数的特定调用的局部变量,而不是整个函数的局部变量。也许这导致您对函数的行为产生了误解。
【讨论】:
以上是关于在 K&R 中找到的 C 问题中的二叉树实现的主要内容,如果未能解决你的问题,请参考以下文章