Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Tạo và duyệt cây nhị phân tìm kiếm ?

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    27

    Mặc định Tạo và duyệt cây nhị phân tìm kiếm ?

    Bạn nào giúp mình coi bài này với . Tạo và duyệt cây nhị phân , không biết sai chỗ nào ? Thanks

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<dos.h>
    5. #include<stdlib.h>
    6.  
    7. typedef struct nut{
    8.             int d;
    9.             nut *pleft;
    10.             nut *pright;
    11.                };
    12.  
    13. int chennut(nut *p,int x);
    14. int chennut(nut *p,int x)
    15. {
    16.  if(p!=NULL)
    17.  {
    18.   if(p->d==x) return 0;
    19.   if(p->d>x) return chennut(p->pleft,x);
    20.   else return chennut(p->pright,x);
    21.  }
    22.  
    23.  p=(nut*)malloc(sizeof(nut));
    24.  if(p==NULL) return -1;
    25.  p->d=x;
    26.  p->pleft=p->pright=NULL;
    27.  return 1;
    28. }
    29.  
    30. void duyetcay(nut *p);
    31. void duyetcay(nut *p)
    32. {
    33.  if(p!=NULL)
    34.  {
    35.   printf("%d",p->d);
    36.   duyetcay(p->pleft);
    37.   duyetcay(p->pright);
    38.  }
    39. }
    40.  
    41. void main()
    42. {
    43.  nut *p;
    44.  int n,i,x;
    45.  clrscr();
    46.  printf("nhap so nut:");
    47.  scanf("%d",&n);
    48.  for(i=1;i<=n;i++)
    49.  {
    50.   printf("gia tri nut %d:",i);
    51.   scanf("%d",&x);
    52.   chennut(p,x);
    53.  }
    54.  
    55.  duyetcay(p);
    56.  
    57.  getch();
    58. }

  2. #2
    Ngày gia nhập
    02 2007
    Nơi ở
    TP.HCM - dưới cầu SG
    Bài viết
    12

    Mình góp ý một chút:
    + Bạn đã hiện thực hàm trước khi sử dụng hàm này trong main -> ko cần khai báo mẫu hàm ( prototype ) int chennut(nut *p,int x);void duyetcay(nut *p);
    + Bạn khai báo nut *p; trong hàm main, điều đó ko có nghĩa là p = NULL ( khi khai báo vậy, p trỏ tới một vị trí nhớ nào đó trong bộ nhớ nhưng nó ko đồng nghĩa với NULL ) nên khi bạn gọi chennut(p,x); đối với nút đầu tiên sẽ là chèn vào p->left hoặc p->right => có thể can thiệp tới những vùng nhớ khác và gây lỗi.
    + Đối với lần đầu tiên gọi hàm chennut(p,x), p là NULL nên sau khi thực hiện hàm chèn này, p sẽ trỏ tới nút gốc ( nghĩa là đã thay đổi trị trong con trỏ p ) => phải dùng tham chiếu.

    Như vậy, bạn cần sửa:
    + int chennut(nut *&p,int x);
    + nut *p = NULL ( trong main)

    Bạn cũng nên xem qua cách xây dựng cây trong các sách về Cấu trúc dữ liệu. Thường chúng khá chuẩn và đẹp mắt
    Thân!
    Nơi nào khiến anh dừng bước, nơi đó có em.

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    15

    Mình mới viết cây nhị phân, bài này sai nhiều wá, giúp mình sửa lại với!!! thanks
    C Code:
    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<conio.h>
    4. typedef struct nut
    5. {
    6.     int d;
    7.     nut *left, *right;
    8. };
    9. typedef struct NODE
    10. {
    11.     nut *root; //nut goc cua cay
    12. };
    13. void KhoiTao(NODE cay)
    14. {
    15.     cay.root=NULL;
    16. }
    17. NODE *getnode(int x)
    18. {
    19.     NODE *p=(NODE*)malloc(sizeof(NODE));
    20.     p->info=x;
    21.     p->left=p->right=NULL;
    22.     return p;
    23. }
    24. int makenode(int x)
    25. {   int p;
    26.     p=getnode();
    27.     p->info=x;
    28.     p->left=NULL;
    29.     p->right=NULL;
    30.         return(p);
    31. }
    32. void ThemTrai(cay &s, int x)
    33. {       if(p==NULL)
    34.         printf("Nut p khong hien huu\n");
    35.     else
    36.     {
    37.         if(p->left!=NULL)
    38.             printf("Nut p da co nut con ben trai\n");
    39.         else
    40.             p->left=makenode(x);
    41.     }
    42. }
    43. void ThemPhai(cay &s, int x)
    44. {
    45.     if(p==NULL)
    46.         printf("Nut p khong hien huu\n");
    47.     else
    48.     {   if(p->right=NULL);
    49.             printf("Nut p da co nut con ben phai\n");
    50.         else
    51.             p->right=makenode(x);
    52.     }
    53. }
    54. void Duyet_NLR(cay*root)
    55. {   if(!root) return;
    56.     else
    57.     {   printf("%3d",root->info);
    58.         Duyet_NLR(root->left);
    59.         Duyet_NLR(root->right);
    60.     }
    61. }
    62. void main()
    63. {   clrscr();
    64.     KhoiTao(s);
    65.     printf("Hay nhap gia tri goc vao: ");
    66.     ThemTrai(x);
    67.     ThemPhai(x);
    68.     Duyet_NLR;
    69.     getch();
    70. }
    71. /*
    72. // Dem tat ca cac node tren cay
    73. long demtatcanode(cay*root)
    74. {   if(!root) return 0;
    75.     return  +Demtatcanode(root->left)
    76.         +Demtatcanode(root->right)
    77. }
    78. Dem nut la
    79. long DemLa(cay *root)
    80. {   if(!root) return 0;
    81.     int dem=demla(root->left)+demla(root->right)
    82.     if(root->left==NULL&&root->right==NULL)
    83.         dem++;
    84. }
    85. */

  4. #4
    Ngày gia nhập
    03 2008
    Bài viết
    57

    Đúng là bài của bạn ketbeophi sai nhiều chỗ quá.
    Bạn khai báo có 2 cấu trúc là nut và NODE mà bạn lại sử dụng tham số là "cay" trong rất nhiều hàm về sau
    cái này chưa khai báo thì nó báo sai là đúng.
    Tôi đoán chắc bạn nghĩ bạn đã khai báo trong hàm khoitao là NODE *cay thì ở các hàm sau bạn dùng biến cay thoải mái
    Đó là sai lầm vì cay chỉ là biến cục bộ trong hàm khoitao thôi . trong các hàm khác nó đâu hiểu. muốn thê bạn phải khai báo biến toàn cục NODE *cay thì nó mới hiểu.
    Hơn nữa trong các hàm themtrai them phai,.... bạn truyền vào là cay mà bạn lại sử dụng biến con trỏ p. p ở đâu ra. trong main bạn cũng sử dụng cay và x mà chưa khai báo thì nó báo lỗi là phải.
    Bạn nên nhớ các biến mà bạn khai báo trong mỗi hàm thì chỉ hàm đó hiểu mà thôi sau khi kết thúc hàm thì vùng nhớ cấp phát cho biến đó sẽ bị giải phóng. Do đó các hàm khác sẽ không hiểu biến đó đâu.

    Bạn có thể vào đây để tham khảo nhiều hơn về cây nhị phân tìm kiếm
    http://forums.congdongcviet.com/showthread.php?t=5091
    Đã được chỉnh sửa lần cuối bởi thanhluan07 : 04-06-2008 lúc 08:06 PM.

  5. #5
    Ngày gia nhập
    10 2007
    Bài viết
    15

    cám ơn bạn mình đang sửa lại đây!!!!
    có thể giúp mình cái giải thuật "trên cây có phần tử nào xuất hiện hơn mấy lần"....

Các đề tài tương tự

  1. Trình duyệt Opera, giúp bạn trải nghiệm tốt hơn khi duyệt wap
    Gửi bởi hailuacuibep trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 2
    Bài viết cuối: 02-01-2013, 12:12 PM
  2. Cho xin ý kiến về duyệt cây nhị phân không đệ quy
    Gửi bởi ccb123 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 12-12-2012, 05:00 PM
  3. Làm sao hiện thị kết quả tìm kiếm trong file.xml lên trình duyệt
    Gửi bởi kjkjzo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 14-08-2012, 09:31 AM
  4. Cách thức duyệt tiền tự trên cây khi duyệt từ con trái nhất rồi sang anh em ruột phải?
    Gửi bởi tyrant trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 14-09-2011, 10:53 AM
  5. Tìm kiếm nhị phân thắc mắc về Duyệt tuần tự ?
    Gửi bởi laphong10th trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 11-11-2010, 10:47 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn