我正在学习 C 并在我的 C 书中找到了一个基本的树实现:
#include <stdio.h>
#include <stdlib.h>
struct tree_node {
int data;
struct tree_node *left_p, *right_p;
};
struct tree_node *t_search(struct tree_node *root, int v) {
while (root) {
printf("Looking for %d, looking at %d\n", v, root->data);
if (root->data == v)
return root;
if (root->data > v)
root = root->left_p;
else
root = root->right_p;
}
return 0;
}
int t_insert(struct tree_node **root, int v) {
while (*root) {
if ((*root)->data == v)
return 1;
if ((*root)->data > v)
root = &((*root)->left_p);
else
root = &((*root)->right_p);
}
if ((*root = (struct tree_node *) malloc(sizeof(struct tree_node))) == 0)
return 2;
(*root)->data = v;
(*root)->left_p = 0;
(*root)->right_p = 0;
return 0;
}
int main(void) {
struct tree_node *tp, *root_p = 0;
int i;
t_insert(&root_p, 4);
t_insert(&root_p, 2);
t_insert(&root_p, 6);
t_insert(&root_p, 1);
t_insert(&root_p, 3);
t_insert(&root_p, 4);
t_insert(&root_p, 7);
for (i = 0; i < 9; i++) {
tp = t_search(root_p, i);
if (tp)
printf("%d found\n", i);
else
printf("%d not found\n", i);
}
return 0;
}
虽然代码看起来很简单,但我很难理解这个t_insert
功能。为什么它需要 astruct tree_node **root
而不是struct tree_node *root
?t_serach
几乎是相同的代码,但只使用指针而不是指针指针。也许另一个例子可以更好地解释这个问题。
对于它的价值:我来自 Java 背景。
注意:是的,我知道插入时树没有重新平衡。