我有一个代表二叉树的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
中的每个元素entries
,E->left
和E->right
应设置为NULL
,因为它们在技术上并未被使用。我将如何实现这一目标?
答案 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);
}