Giải thuật kiểmtranhịphân tìm kiếm: Nhận thấy, nhịphân T nhịphân tìm kiếm : - Các trái phải T nhịphân tìm kiếm - Khóa gốc T lớn Max khố thuộc trái T - Khóa gốc T nhỏ Min khoá thuộc phải T Từ trình bày giả thuật sau: B1: Kiểmtra xem trái T có nhịphân tìm kiếm hay khơng ? Nếu khơng chuyển xuống B5 B2: Kiểmtra xem khóa gốc T có lớn Max khoá thuộc trái T, nhỏ Min khoá thuộc phải T hay không ? Nếu không chuyển xuống B5 B3: Kiểmtra xem phải T có nhịphân tìm kiếm hay khơng ? Nếu khơng chuyển xuống B5 B4: Kết luận T nhịphân tìm kiếm B5: Kết luận T nhịphân tìm kiếm Ngơn ngữ tựa C: TimMax(T, Max) // Tìm giá trị khố Max T { if (T==NULL) return; if (T->P_L != NULL) Max = (Max > T->P_L->KEY)? Max : T->P_L->KEY; if (T->P_R != NULL) Max = (Max > T->P_R->KEY)? Max : T->P_R->KEY; Max = (Max > T->KEY) ? Max : T->KEY; TimMax(T->P_L, Max); TimMax(T->P_R, Max); } TimMin(T, Min) // Tìm giá trị khố Min T { if (T==NULL) return; if (T->P_L != NULL) Min = (Min < T->P_L->KEY)? Min : T->P_L->KEY; if (T->P_R != NULL) Min = (Min < T->P_R->KEY)? Min : T->P_R->KEY; Min = (Min < T->KEY) ? Min : T->KEY; TimMin(T->P_L, Min); TimMin(T->P_R, Min); } KiemTra(T)//Nếu kết T nhịphân tìm kiếm { if (T==NULL) return 0; Left = KiemTra(T->P_L); If (Left) // Cây trái khơng nhịphân tìm kiếm return 1; if (T->P_L != NULL && T->P_R != NULL) // T Có { TimMax(T->P_L, MaxL); TimMin(T->P_R, MinR); if (!(MaxL < T->KEY && T->KEY < MinR)) return 1; } else if (T->P_L == NULL && T->P_R != NULL)// Chỉ có phải { TimMin(T->P_R, MinR); if (!(T->KEY < MinR)) return 1; } else if (T->P_L != NULL && T->P_R == NULL)//Chỉ có trái { TimMax(T->P_L, MaxL); if (!(MaxL < T->KEY)) return 1; } Right = KiemTra(T->P_R); return Left + Right; } Giải thuật chuyểnđổi biểu thức TrungtốsangHậu tố: CHUYEN_DOI_BIEU_THUC() {//Giải thuật sử dụng stact S, trỏ T, lúc đầu T = -1 { Đọc thành phần X biểu thức; if (X toán hạng) printf(X); else if (X phép toán) { if ((T>-1) && (S[T] phép tốn có độ ưu tiên cao X)) printf(POP(S, T)); if ((T==-1) || (S[T]==’(’ || (S[T] phép tốn có độ ưu tiên thấp X)) PUSH (S, T, X); } while (phép toán X đưa vào S) else if (X dấu ‘(‘) PUSH (S, T, X); else if (X dấu ‘)‘) { printf(POP(S, T)); // in phép toán while (S[T]==’)’); POP(S, T)); loại dấu ‘)’ khỏi S } } while (chưa gặp dấu kết thúc biểu thức dạng trung tố); printf(POP(S, T)); // in phép toán while (T>-1); } TT_GIUA_S(T) // Hàm không đệ qui duyệt theo thứtự if (T == NULL) // 1- Khởi đầu { printf(‘Cây rỗng’); return; } else { TOP = -1; P=T; } while ((P!=NULL) || (TOP>-1)) // - Thực duyệt { while (P != NULL) // Lưu trữ địa gốc, xuống trái { PUSH(S, TOP,P); P= P->P_L; } // Thăm gốc, xuống phải P= POP(S, TOP); printf(P->DATA); P= P->P_R } } ... if (!(MaxL < T->KEY)) return 1; } Right = KiemTra(T->P_R); return Left + Right; } Giải thu t chuyển đổi biểu thức Trung tố sang Hậu tố: CHUYEN_ DOI_ BIEU_THUC() {//Giải thu t sử dụng stact S, trỏ... Min); TimMin(T->P_R, Min); } KiemTra(T)//Nếu kết T nhị phân tìm kiếm { if (T==NULL) return 0; Left = KiemTra(T->P_L); If (Left) // Cây trái khơng nhị phân tìm kiếm return 1; if (T->P_L != NULL... dạng trung tố); printf(POP(S, T)); // in phép tốn while (T>-1); } TT _GIUA_ S(T) // Hàm khơng đệ qui duyệt theo thứ tự if (T == NULL) // 1- Khởi đầu { printf(‘Cây rỗng’); return; } else { TOP =