c - C 中仅使用指针的二叉树

标签 c pointers binary-tree binary-search

我正在用 C 语言完成家庭作业,我认为二叉搜索树将是实现我的解决方案的最佳方式。问题是我们不允许定义结构或任何复合数据类型,所以没有

struct TreeNode {
    struct TreeNode* parent;
    struct TreeNode* left;
    struct TreeNode* right;
    int key;
    int value;
}

或者类似的东西。

树必须完全用指针来实现,因此我一直在尝试定义许多宏,以使导航和编辑树更容易,例如这个宏用于获取指向节点父节点的指针(其中指针是空指针):

#define PARENT(ptr) *(void *)(ptr+ALIGNMENT)

当然,问题是您无法取消引用 void 指针。我的问题是:如果您有一个 void 指针,指向内存中存储另一个 void 指针的位置,那么如何读取该存储的指针。

或者如果这是不可能的,是否有更好的方法来制作这棵树?

最佳答案

将节点表示为数组,并使用指针算术来访问给定节点的左节点和右节点。例如,数字序列4,3,7,1,6存储在二叉树中:

     4
    / \ 
   3   7 
  / \ 
 1   6

如果您选择使用数组来表示这棵树,则位置 C 的节点的左子节点的位置为 2 * C,其右节点位于2 * C + 1。在我们的示例中,数字 3 位于第二 位置。它的左子节点位于 2 * 2 处,即位于 第四 位置,右子节点位于 2 * 2 + 1 处,即位于第五名:

values:     4     3     7     1     6
positions: 1st   2nd   3rd   4th   5th 

以下示例代码演示了如何遍历基于数组的二叉树。您可以弄清楚如何将新值插入树中(使用上面的公式),如何动态增长数组,如何使用指针算术访问子节点等:

#include <stdio.h>

#define ARRAY_SIZE 5
static int btree[ARRAY_SIZE];

static void fill_btree ();
static void walk_btree ();

int
main ()
{
  fill_btree ();
  walk_btree ();
  return 0;
}

static void 
fill_btree ()
{
  btree[0] = 4;
  btree[1] = 3;
  btree[2] = 7;
  btree[3] = 1;
  btree[4] = 6;
}

static int
pos (int i)
{
  return ((i + 1) * 2);
}

static void 
walk_btree ()
{
  int i;

  for (i = 0; i < ARRAY_SIZE; ++i)
    {
      int p = pos(i);
      int root = btree[i];
      int left = ((p - 1) < ARRAY_SIZE) ? btree[p-1] : 0;
      int right = (p < ARRAY_SIZE) ? btree[p] : 0;

      printf ("root: %d, left: %d, right: %d\n", root, left, right);
    }
}

关于c - C 中仅使用指针的二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062381/

相关文章:

c - 从 C 中的前缀表达式构建解析树

c - 一些带有 'extern' 指针的神秘主义者,指向 C 中的结构

c++ - "Stack overflow"错误。可能指针不在列表中

c++ - 在二叉搜索树中查找元素

java - 为二叉搜索树实现 add 方法

c++ - 确定指针在文本文件中的位置

c++ - 如何在苹果的 AudioUnit 3D Mixer 上设置总线?

c - 是什么阻止了 mtd 被读取?

c - 执行 AIX 内核扩展程序时出错

阐明 GNU C 库如何定义不可重入函数