2010-07-22 68 views
12

Ai đó có thể hướng dẫn tôi đến một số hướng dẫn về Cấu trúc dữ liệu cây bằng C. Tôi đã thử googling nhưng hầu hết các triển khai đều dành cho C++ hoặc Java.Nếu ai đó có thể chỉ cho tôi một số hướng dẫn trực tuyến có trong C sẽ rất tuyệt.Hướng dẫn cấu trúc dữ liệu cây trong C

Cảm ơn ..

+0

Đọc bất kỳ cuốn sách cấu trúc dữ liệu tốt nào. – Tauquir

+0

Nhìn theo phần 4 tại https://ece.uwaterloo.ca/~ece250/Lectures/Slides/ Trang web có nhiều cấu trúc dữ liệu và triển khai thuật toán khác và giải thích về chúng và thời gian chạy/phân tích tiệm cận của chúng – rrazd

Trả lời

13

Generic phương pháp cây traversal: http://en.wikipedia.org/wiki/Tree_traversal (xem bên phù hợp với một danh sách lớn của các thuật toán để lựa chọn).

Một số hướng dẫn:

+1

Cảm ơn eruciform ... Chỉ cần những gì tôi đang tìm kiếm. –

+1

không có vấn đề gì - vui lòng nhấp vào dấu kiểm màu xanh lục khi bạn có cơ hội – eruciform

1

Dưới đây là một chút mã hướng dẫn từ một vài thập kỷ trước đây. Trong thực tế, nó đã được nằm xung quanh quá lâu, tôi không nhớ nó đến từ đâu hoặc những người đã viết nó (có thể đã được tôi, nhưng tôi thực sự không chắc chắn). Về mặt lý thuyết nó là một chút không di động, sử dụng strdup, mà không phải là một phần của thư viện chuẩn, mặc dù hầu hết các trình biên dịch có/cung cấp nó.

/* 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; 
} 
+1

@ Jerry..Tôi đang tìm kiếm thêm một số hướng dẫn thay vì mã thực tế. Tôi muốn có được một nắm bắt tốt về các khái niệm và sau đó thử nó ra bản thân mình ... Dù sao cảm ơn !!! –

+0

@ The Stig: Ah, nhưng đây hoàn toàn là điểm khởi đầu - nó hiện không hỗ trợ tìm kiếm các giá trị cụ thể (nên khá dễ dàng), xóa (phần nào không tầm thường), duy trì sự cân bằng (* decidedly * non-tầm thường), v.v. –

Các vấn đề liên quan