Mình đang làm bài tập về các thao tác trên Skew Heap, không hiểu chương trình lỗi ở đoạn nào. Chắc lại liên quan đến con trỏ.

C++ Code:
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <conio.h>
  4.  
  5. struct Node
  6. {
  7.     int key;    // khoa
  8.     Node *left; // con tro toi dinh trai
  9.     Node *right;// con tro toi dinh phai
  10. };
  11.  
  12. void swap (Node *&root1, Node *&root2)
  13. {
  14.     Node *temp;
  15.     temp = root1;
  16.     root1 = root2;
  17.     root2 = temp;
  18. }
  19.  
  20. Node* MakeHeap(int key)
  21. {
  22.     Node *temp = NULL;
  23.     temp = (Node *) malloc ( sizeof(Node) );
  24.     temp->key = key;
  25.     temp->left = NULL;
  26.     temp->right = NULL;
  27.     return temp;
  28. }
  29.  
  30. Node* Union(Node* &root1, Node* &root2)
  31. {
  32.     if ( root1 == NULL ||
  33.        ( root2 != NULL && root2->key < root1->key ) )
  34.         swap(root1, root2);
  35.     if(root1 != NULL)
  36.         root1->right = Union(root1->right, root2) ;
  37.     if( root1->right != NULL )
  38.         swap(root1->left, root1->right);
  39.     return root1;
  40. }
  41.  
  42. void Insert(Node *&root, int key)
  43. {
  44.     Node *newHeap = MakeHeap(key);
  45.     root = Union( root, newHeap );
  46. }
  47.  
  48. int FindMin(Node root)
  49. {
  50.     return root.key;
  51. }
  52.  
  53. int DeleteMin(Node *root)
  54. {
  55.     int temp = root->key;
  56.     root = Union(root->left, root->right);
  57.     return temp;
  58. }
  59.  
  60. // duyet theo thu tu truoc
  61. void printPreOrder(Node *root)
  62. {
  63.     if ( root != NULL )
  64.     {
  65.         printf("%d\n", root->key);
  66.         printPreOrder(root->left);
  67.         printPreOrder(root->right);
  68.     }
  69. }
  70.  
  71. int main()
  72. {
  73.     Node *sh1 = MakeHeap(5);
  74.     Node *sh2 = MakeHeap(3);
  75.     Node *sh = Union(sh1, sh2);
  76.     printPreOrder(sh);
  77.     getch();
  78.     return 0;
  79. }