1

我有一个表示二叉树的 C 结构:

struct btree {
    char *word; 
    int frequency; 
    struct btree *left; 
    struct btree *right; 
}; 

我想创建一个函数,该函数返回传递给它的二叉树btree_list(struct btree*)中所有对象的数组。btree顺序无所谓。

以下是此功能如何工作的示例:

struct btree *T = populate_with_random_values(); 
struct btree *entries = (struct btree*) malloc(sizeof(struct btree) * btree_size(T));

entries = btree_list(T);

while (*entries != NULL) {
    printf("There are %d occurences of the word %s", entries->frequency, entries->word); 
    entries++; 
}

同样对于,中的每个元素E,并且应该设置为,因为它们在技术上没有被使用。我将如何实施呢?entriesE->leftE->rightNULL

4

3 回答 3

1

那么,你想要一个前序、中序还是后序遍历?

这是伪代码中的预购示例:(来自维基百科

iterativePreorder(node)
  parentStack = empty stack
  while not parentStack.isEmpty() or node ≠ null
    if node ≠ null then
      visit(node)
      if node.right ≠ null then
        parentStack.push(node.right)
      node = node.left
    else
      node = parentStack.pop()

您必须稍微调整一下才能让它返回节点列表,但是遍历树背后的想法就在那里。

于 2013-10-17T05:19:14.523 回答
1

与其返回数组,不如只传递它的基地址以使您的生活更轻松并返回数组的计数:

int TraverseTree(int arr[],btreenode *root, int depth)
{
    static int count = 0;
    if (root)
    {
        count++;
        TraverseTree(arr,root->right,depth+1);
        arr[depth]=root->data;
        TraverseTree(arr,root->left, depth+1);
    }
    return count;
}
于 2013-10-17T05:30:43.270 回答
1

这可能是数组:

typedef struct {
    struct btree **data;
    size_t count;
} t_tbl;

t_tbl *tbl_create(size_t count)
{
    t_tbl *new = NULL;

    if (count > 0) {
        new = malloc(sizeof(t_tbl));
        new->data = malloc(count * sizeof(struct btree *));
        new->count = 0;
    }
    return new;
}

void tbl_destroy(t_tbl *table)
{
    if (table) {
        free(table->data);
        free(table);
    }
}

这可能是过程:

void btree_populate_array(const t_node *root, t_tbl *table)
{
    if (root->left) btree_populate_array(root->left, table);
    table->data[table->count++] = root;
    if (root->right) btree_populate_array(root->right, table);
}

if (root) {
    t_tbl *table = tbl_create(btree_size);
    btree_populate_array(root, table);
    /* Do stuff with array */
    tbl_destroy(table);
}

malloc如果您不知道 btree 的大小,您必须检查:

void btree_count(const t_node *root, size_t *count)
{
    if (root->left) btree_count(root->left, count);
    (*count)++;
    if (root->right) btree_count(root->right, count);
}

size_t btree_size = 0;

if (root) {
    btree_count(root, &btree_size);
}
于 2013-10-17T05:33:25.493 回答