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

Đề tài: Chèn nút vào cây tìm kiếm nhị phân không đệ quy, chỉ được nút cuối cùng?

  1. #1
    Ngày gia nhập
    08 2010
    Bài viết
    20

    Mặc định Chèn nút vào cây tìm kiếm nhị phân không đệ quy, chỉ được nút cuối cùng?

    Mọi người xem giúp mình đoạn code này :
    C Code:
    1. void InsertNode(KeyType X ,TTree *T)  // Khong dung de quy
    2. {
    3.  
    4.   while((*T)!=NULL)
    5.      {
    6.        if ((*T)->Key==X )
    7.             {
    8.               printf("\n Da ton tai khoa nay trong Cay ");
    9.               break;
    10.             }
    11.        else {
    12.              if((*T)->Key>X)  (*T)=(*T)->Left;
    13.              else (*T)=(*T)->Right;
    14.             }
    15.      }
    16.    if ((*T)!=NULL) {
    17.    (*T)=(Node*)malloc(sizeof(Node));
    18.    (*T)->Key=X;
    19.    (*T)->Left=NULL;
    20.    (*T)->Right=NULL;
    21.     }
    22. }

    Nhưng mình chỉ lưu được nút nhập sau cùng , mọi người vào xem giúp em lỗi ở đâu ah ? thanks

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn phải đưa hết code toàn chương trình lên mới debug được chứ. KeyType, TTree, Node trong đó chứa cái gì ?
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    20

    Code Full của em

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<alloc.h>
    4.  
    5. typedef int KeyType ;
    6. typedef struct Node
    7. {
    8.   KeyType Key;
    9.   Node*   Left;
    10.   Node*   Right;
    11. };
    12.  
    13. typedef Node* TTree;
    14.  
    15. void MakeNull_Tree(TTree *T)
    16. {
    17.   (*T)=NULL;
    18. }
    19.  
    20. int Empty_Tree(TTree T)
    21. {
    22.   return T==NULL;
    23. }
    24.  
    25. TTree LeftChild(TTree T)
    26. {
    27.    if(T!=NULL)
    28.    return T->Left;
    29.    else return NULL;
    30. }
    31.  
    32. TTree RightChild(TTree T)
    33. {
    34.   if (T!=NULL)
    35.    return T->Right;
    36.   else return NULL;
    37. }
    38.  
    39. int isLeaf(TTree T)
    40. {
    41.   if((T!=NULL)&&(T->Left==NULL)&&(T->Right==NULL))
    42.      return 1;
    43.    else return 0;
    44. }
    45.  
    46. //Duyet trung tu
    47. void LNR(TTree T)
    48. {
    49.   if (T!=NULL)
    50.   {
    51.      LNR(LeftChild(T));
    52.      printf(" %d",T->Key);
    53.      LNR(RightChild(T));
    54.   }
    55. }
    56.  
    57. void InsertNode(KeyType X ,TTree *T)  // Khong dung de quy
    58. {
    59.  
    60.   while((*T)!=NULL)
    61.      {
    62.        if ((*T)->Key==X )
    63.             {
    64.               printf("\n Da ton tai khoa nay trong Cay ");
    65.               break;
    66.             }
    67.        else {
    68.              if((*T)->Key>X)  (*T)=(*T)->Left;
    69.              else (*T)=(*T)->Right;
    70.             }
    71.      }
    72.    if ((*T)==NULL) {
    73.    (*T)=(Node*)malloc(sizeof(Node));
    74.    (*T)->Key=X;
    75.    (*T)->Left=NULL;
    76.    (*T)->Right=NULL;
    77.     }
    78. }
    79.  
    80.  
    81. void ReadTree(TTree *T)
    82. {
    83.   int i,n;
    84.   KeyType X;
    85.   do {
    86.   printf("\n Nhap vao so nut tren cay : ");scanf("%d",&n);
    87.   }while(n==0);
    88.   printf("\n Nhap vao khoa  nut goc : ");scanf("%d",&X);
    89.   InsertNode(X,T);
    90.   for(i=1;i<n;i++)
    91.    {
    92.     printf("\n Nhap khoa nut thu %d : ",i);
    93.     scanf("%d",&X);
    94.     InsertNode(X,T);
    95.    }
    96. }
    97.  
    98. void main()
    99. {
    100.   TTree T;
    101.   MakeNull_Tree(&T);
    102.   clrscr();
    103.   ReadTree(&T);
    104.   printf("\n Duyet trung tu :");
    105.   LNR(T);
    106.   getch();
    107. }
    Đã được chỉnh sửa lần cuối bởi tyrant : 16-10-2011 lúc 12:49 PM.

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Truy xuất bằng con trỏ rất nguy hiểm vì nó có thể thay đổi trị của biến sau khi ra khỏi hàm. Bạn đừng quá tiết kiệm biến để rồi bị những lỗi đỡ ko được.

    C Code:
    1. Node *InsertNode(KeyType X ,TTree *T)  // Khong dung de quy
    2. {
    3.     TTree node = (*T);
    4.     TTree *prev = NULL;
    5.    
    6.     while (node != NULL)
    7.     {
    8.         if (node->Key == X )
    9.         {
    10.             printf("\n Da ton tai khoa nay trong Cay ");
    11.             return NULL;
    12.         }
    13.         else
    14.         {
    15.             if (node->Key > X)
    16.             {
    17.                 prev = &node->Left;
    18.                 node = node->Left;
    19.             }
    20.             else
    21.             {
    22.                 prev = &node->Right;
    23.                 node = node->Right;
    24.             }
    25.         }
    26.     }
    27.  
    28.     if (prev == NULL)
    29.     {
    30.         prev = T;
    31.     }
    32.  
    33.     (*prev) = (Node *)malloc(sizeof(Node));
    34.     (*prev)->Key = X;
    35.     (*prev)->Left = NULL;
    36.     (*prev)->Right = NULL;
    37.  
    38.     return (*prev);
    39. }
    40.  
    41.  
    42. void ReadTree(TTree *T)
    43. {
    44.     int i,n;
    45.     KeyType X;
    46.  
    47.     do
    48.     {
    49.         printf("\n Nhap vao so nut tren cay : ");scanf("%d",&n);
    50.     }
    51.     while(n == 0);
    52.  
    53.     printf("\n Nhap vao khoa  nut goc : ");scanf("%d",&X);
    54.     (*T) = InsertNode(X,T);
    55.  
    56.     for(i=1;i<n;i++)
    57.     {
    58.         printf("\n Nhap khoa nut thu %d : ",i);
    59.         scanf("%d",&X);
    60.         InsertNode(X,T);
    61.     }
    62. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    08 2010
    Bài viết
    20

    Cám ơn anh Meo , Nhưng anh có thể giải thích giúp em khi khai báo TTree *prev = NULL , em hơi nhập nhằng chổ này ,có phải prev là 1 biến con trỏ để lưu trữ địa chỉ của nút mình vừa duyệt qua không ah ?
    Đã được chỉnh sửa lần cuối bởi tyrant : 16-10-2011 lúc 01:22 PM.

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Chèn nút vào cây tìm kiếm nhị phân không đệ quy, chỉ được nút cuối cùng?

    Trích dẫn Nguyên bản được gửi bởi tyrant Xem bài viết
    Cám ơn anh Meo , Nhưng anh có thể giải thích giúp em khi khai báo TTree *prev = NULL , em hơi nhập nhằng chổ này ,có phải prev là 1 biến con trỏ để lưu trữ địa chỉ của nút mình vừa duyệt qua không ah ?
    Đúng như thế, nó là biến lưu vị trí phía trước vị trí đang xét.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    08 2010
    Bài viết
    20

    anh Mèo ơi cho em hỏi thêm cái này với , đoạn Code Xóa nút không đệ quy trường hợp nút cần xóa có tối đa 1 cây em làm được rồi nhưng trường hợp nút đó có 2 cây con còn chút vấn đề . Code em

    Code:
    void DeleteNode2(KeyType X,TTree *T)   // xoa nut co 2 cay con
    {
       TTree P=*T;
       TTree Q;
       int found=0;
       while((P!=NULL)&&(found==0))
    	 {
    	   if(P->Key==X) found=1;
    	   else
    		{
    		  if(P->Key>X) P=P->Left;
    		  else P=P->Right;
    
    		}
    	 }
    	 if(found==1)
    	  {
    		Q=P;
    		P=P->Left;
    		while(P->Right!=NULL)
    		{
    		 P=P->Right;
    		}
    		Q->Key=P->Key;
    	  }
    }
    Đoạn Code này tìm được vị trí P cần xóa , em thay thế nút ở vị trí P này bằng Q , cuối cùng duyệt tìm nút con trái lơn nhất của P , sao đó gán vào cho Q->Key , nhưng như vậy em chỉ mới thay thế được khóa , P vẫn tồn tại dù em có thử giải phóng biến P free (P) nhưng vẫn không xóa được , anh xem giúp em . Thanks anh

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Nếu xóa ko đệ quy thì mỗi lần tìm thấy thì phải xóa ngay và đoạn code xóa phải nằm trong vòng lặp.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    08 2010
    Bài viết
    20

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Nếu xóa ko đệ quy thì mỗi lần tìm thấy thì phải xóa ngay và đoạn code xóa phải nằm trong vòng lặp.
    không được anh Meo ơi , em để free trong hay ngoài vòng lập cũng không xóa được , kết quả vẫn y chang vậy ah anh hix

  10. #10
    Ngày gia nhập
    02 2012
    Bài viết
    4

    Mặc định anh mèo cho em hỏi cái sau &,*;

    khi khai báo typedef NODE *TREE, ở đây TREE la con trỏ kiểu NODE,sau đó khai báo TREE t, trong bo nhớ hiểu như thế nào ạk. với lại cái khi khai báo protype cua hàm sử lý cây vd: make_tree(TREE &t) or make_tree(TREE *t) cac truong hợp này nhu the nào ạk em khong hieu lam. còn cái dòng prev = &node->Left; anh dung dấu & em thấy hơi lạ muk hay hay chi em với.

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

  1. Thêm 1 nút , Xóa 1 nút , Sửa 1 nút, duyệt danh sách theo liên kết phải, theo liên kết trái.
    Gửi bởi dodinhlong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 23-05-2013, 11:51 AM
  2. Trả lời: 3
    Bài viết cuối: 11-04-2012, 09:26 AM
  3. Cấu trúc dữ liệu Thêm nút và In nút trong binary tree, ai giúp em với.
    Gửi bởi HacAmThienThan trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 5
    Bài viết cuối: 24-10-2011, 04:12 PM
  4. Sự kiện Click nút Next và nút Previous trong code WMP dùng WMPLib
    Gửi bởi hocphp_1998 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 15-12-2010, 09:24 PM
  5. cách chuyển nút close form thành nút phóng to
    Gửi bởi tuanngocpt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 05-11-2010, 07:13 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