Cây nhị phân số nguyên có đầy đủ các chức năng cơ bản: nhập cây, duyệt cây, chèn một nút vào cây, xóa một nút khỏi cây, tìm kiếm nút
// Nguyen Cong Cuong - KTPM K14B #include iostream #include stdlib.h using namespace std; typedef struct Node{ int Data; Node* Left; Node* Right; }; typedef struct Node* BinaryTree; // Khoi tao void InIt(BinaryTree& T){ T = NULL; } //kiem tra rong bool IsEmpty(BinaryTree T){ return (T == NULL); } // Tao Noode Node* AddNode(Node* P,int x){ P = (Node*)malloc(sizeof(Node)); P->Data = x; P->Left = NULL; P->Right = NULL; return P; } //Them vao nut la void AddTree(BinaryTree& T, int x){ Node* P = AddNode(P,x); if (IsEmpty(T)) T = P; else { Node* M = T; Node* Q = NULL; while (M != NULL){ Q = M; if (M->Data < x){ M = M->Right; } else M = M->Left; } if (Q->Data < x) Q->Right = P; else Q->Left = P; } } void InPut(BinaryTree& T, int n){ int x; for (int i = 0; i < n; i++){ cout << "Value: " << i + 1 << endl; cin >> x; AddTree(T, x); } } void DuyetTruoc(BinaryTree T){ // duyet truoc Node* M = T; if (M != NULL){ cout << M->Data << " "; DuyetTruoc(M->Left); DuyetTruoc(M->Right); } } void DuyetGiua(BinaryTree T){ Node* M = T; if (M != NULL){ DuyetGiua(M->Left); cout << M->Data << " "; DuyetGiua(M->Right); } } void DuyetSau(BinaryTree T){ Node* M = T; if (M != NULL){ DuyetSau(M->Left); DuyetSau(M->Right); cout << M->Data << " "; } } // tim kiem Node* TimKiem(BinaryTree T, int x){ if (IsEmpty(T)) return NULL; else { Node* M = T; if (M->Data > x) TimKiem(M->Left, x); else if (M->Data < x) TimKiem(M->Right, x); else return M; } } // Tim cha cua mot nut Node* TimCha(BinaryTree T, int x){ Node* M = T; if (IsEmpty(M)) return NULL; else { while (M != NULL){ if (M->Data < x) { M = M->Right; } else{ M = M->Left; } if (M->Left != NULL && M->Left->Data == x) return M; if (M->Right != NULL && M->Right->Data == x) return M; } } } // Xoa void DeleteTree(BinaryTree& T, int x){ Node* M = T; if (M != NULL){ if (M->Left != NULL && M->Left->Data == x){ // nut la if (M->Left->Left == NULL && M->Left->Right == NULL) M->Left = NULL; else { // nut co 1 con if (M->Left->Left != NULL && M->Left->Right == NULL) M->Right = M->Left->Left; if (M->Left->Left == NULL && M->Left->Right != NULL) M->Left = M->Left->Right; } } if (M->Right != NULL && M->Right->Data == x){ if (M->Right->Left == NULL && M->Right->Right == NULL) M->Right = NULL; else { if (M->Right->Left != NULL && M->Right->Right == NULL) M->Right = M->Left->Left; if (M->Right->Left == NULL && M->Right->Right != NULL) M->Left = M->Left->Right; } } if (M->Data == x){ // nut co 2 con if (M->Left != NULL && M->Right != NULL){ if (M->Right->Right == NULL && M->Left->Left == NULL){ M->Data = M->Right->Data; M->Right = NULL; } else{ Node* Q = M->Right; while (Q->Left->Left != NULL){ Q = Q->Left; } if (Q->Left != NULL){ M->Data = Q->Left->Data; DeleteTree(M->Left, Q->Left->Data); DeleteTree(M->Right, Q->Left->Data); } else { M->Data = Q->Right->Data; DeleteTree(M->Left, Q->Right->Data); DeleteTree(M->Right, Q->Right->Data); } } } } DeleteTree(M->Left, x); DeleteTree(M->Right, x); } } // Chen void InsertTree(BinaryTree& T, int x){ Node* P = AddNode(P,x); if (IsEmpty(T)) { P->Left = NULL; P->Right = NULL; T = P; } else { if (T->Data > x) InsertTree(T->Left, x); else{ if (T->Data < x) InsertTree(T->Right, x); else cout << "Da co roi." << endl; } } } // So nut trong cay int Dem(BinaryTree T){ if (IsEmpty(T)) return 0; else return 1 + Dem(T->Left) + Dem(T->Right); } int Max(int a, int b){ if (a > b) return a; else return b; } // Chieu cao cua cay int ChieuCao(BinaryTree T){ if (IsEmpty(T)) return 0; else return Max(ChieuCao(T->Left), ChieuCao(T->Right)) + 1; } Node* ConTrai(BinaryTree T, int x){ if (IsEmpty(T)) return NULL; else { Node* M = T; while (M != NULL){ if (M->Data > x) M = M->Left; else if (M->Data < x) M = M->Right; else { if (M->Left != NULL) return M->Left; else return NULL; } } } } Node* ConPhai(BinaryTree T, int x){ if (IsEmpty(T)) return NULL; else { Node* M = T; while (M != NULL){ if (M->Data > x) M = M->Left; else if (M->Data < x) M = M->Right; else { if (M->Right != NULL) return M->Right; else return NULL; } } } } int SoNutLa(BinaryTree T){ if (IsEmpty(T)) return 0; else { if (T->Left == NULL && T->Right == NULL) return 1; else return SoNutLa(T->Left) + SoNutLa(T->Right); } } int main(){ BinaryTree T; InIt(T); int n, x; cout << "So luong: "; cin >> n; InPut(T, n); system("cls"); int chon; do{ system("cls"); cout << "1. Chen." << endl; cout << "2. Xoa. " << endl; cout << "3. Tim kiem." << endl; cout << "4. Xuat." << endl; cout << "5. So nut" << endl; cout << "6. Tim cha." << endl; cout << "7. Chieu cao." << endl; cout << "8. Tim con. " << endl; cout << "9. So nut la. " << endl; cin >> chon; switch (chon) { case 1:{ cout << "Nhap so can chen: "; cin >> x; InsertTree(T, x); system("pause"); break; } case 2:{ cout << "Nhap so can xoa: "; cin >> x; DeleteTree(T, x); system("pause"); break; } case 3:{ cout << "Nhap so can tim: "; cin >> x; if (TimKiem(T, x) != NULL) cout << x << " co trong cay" << endl; else cout << x << " khong co trong cay" << endl; system("pause"); break; } case 4:{ cout << "Duyet truoc: "; DuyetTruoc(T); cout << endl; cout << "Duyet giua: "; DuyetGiua(T); cout << endl; cout << "Duyet sau: "; DuyetSau(T); cout << endl; system("pause"); break; } case 5:{ int dem = 0; cout << Dem(T) << endl; system("pause"); break; } case 6:{ cout << "Tim cha cua: "; cin >> x; if (x != T->Data){ if (TimCha(T, x) != NULL) cout << TimCha(T, x)->Data << endl; else cout << x << " khong co trong cay" << endl; } else cout << x << " khong co cha" << endl; system("pause"); break; } case 7:{ cout << ChieuCao(T) << endl;; system("pause"); break; } case 8:{ cout << "Nhap so: "; cin >> x; if (ConTrai(T, x) != NULL) cout << "Con trai: " << ConTrai(T, x)->Data << endl; if (ConPhai(T, x) != NULL) cout << "Con phai: " << ConPhai(T, x)->Data << endl; system("pause"); break; } case 9:{ cout << SoNutLa(T) << endl; system("pause"); break; } } } while (chon != 0); return 0; }
Lưu ý: Chỉ thành viên của blog này mới được đăng nhận xét.