我正在学习 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 背景。
注意:是的,我知道插入时树没有重新平衡。