Ответ 1
Общие методы обхода дерева: http://en.wikipedia.org/wiki/Tree_traversal (см. правую боковую панель для огромного списка алгоритмов на выбор).
Некоторые учебники:
Может ли кто-нибудь направить меня в какой-то учебник по структурам данных дерева, используя C. Я пробовал поиск по Google, но большинство реализаций для С++ или Java. Если кто-то может указать мне на некоторые онлайн-учебники, которые находятся на C, было бы здорово.
Спасибо..
Общие методы обхода дерева: http://en.wikipedia.org/wiki/Tree_traversal (см. правую боковую панель для огромного списка алгоритмов на выбор).
Некоторые учебники:
Вот немного учебного кода из нескольких десятилетий назад. На самом деле, он лежал так долго, я не помню, откуда он или кто написал (может быть, я, но я действительно не уверен). Теоретически это немного не переносимо, используя strdup
, который не является частью стандартной библиотеки, хотя большинство компиляторов имеют/поставляют его.
/* Warning: untested code with no error checking included. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* A tree node. Holds pointers to left and right sub-trees, and some data (a string).
*/
typedef struct node {
struct node *left;
struct node *right;
char *string;
} node;
node *root; /* pointers automatically initialized to NULL */
int insert(const char *string, node *root) {
/* Add a string to the tree. Keeps in order, ignores dupes.
*/
int num = strcmp(root->string, string);
node *temp;
for(;;) {
if ( 0 == num)
/* duplicate string - ignore it. */
return 1;
else if (-1 == num) {
/* create new node, insert as right sub-tree.
*/
if ( NULL == root -> right ) {
temp = malloc(sizeof(node));
temp -> left = NULL;
temp -> right = NULL;
temp -> string = strdup(string);
return 2;
}
else
root = root -> right;
}
else if ( NULL == root ->left ) {
/* create new node, insert as left sub-tree.
*/
temp = malloc(sizeof(node));
temp -> left = NULL;
temp -> right = NULL;
temp -> string = strdup(string);
return 2;
}
else
root = root -> left;
}
}
void print(node *root) {
/* in-order traversal -- first process left sub-tree.
*/
if ( root -> left != NULL )
print(root->left);
/* then process current node.
*/
fputs(root->string, stdout);
/* then process right sub-tree
*/
if ( root->right != NULL )
print(root->right);
}
int main() {
char line[100];
/* Let user enter some data. Enter an EOF (e.g., ctrl-D or F6) when done.
*/
while ( fgets(line, 100, stdin))
insert(line, root);
/* print out the data, in order
*/
print(root);
return 0;
}
Вы можете обратиться к ним для примера структуры данных