如何以数组形式获取二叉树的全部内容?

时间:2013-10-17 05:16:02

标签: c algorithm binary-tree

我有一个代表二叉树的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->right应设置为NULL,因为它们在技术上并未被使用。我将如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

那么,您想要预先订购,订购或后序遍历吗?

这是伪代码中的预订示例:(信用Wikipedia

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()

你必须稍微调整一下才能让它返回一个节点列表,但是走在树后面的想法就在那里。

答案 1 :(得分: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;
}

答案 2 :(得分: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);
}

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

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);
}