Ôn tập tốt nghiệp TC38, NC3 (2012)

Ép kiểu  Thường sử dụng khi gán biểu thức gồm các toán hạng khác kiểu. Vd:  Muốn có giá trị chính xác trong phép chia hai số nguyên cần dùng phép ép kiểu : ((float)a)/b  Để đổi giá trị thực r sang nguyên, ta dùng : (int)(r+0.5)

pdf149 trang | Chia sẻ: lylyngoc | Lượt xem: 1363 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Ôn tập tốt nghiệp TC38, NC3 (2012), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Các môn: 1) Phƣơng pháp lập trình (1t) 2) Cấu trúc dữ liệu và giải thuật (2t) 3) Hệ cơ sở dữ liệu (2t) ÔN TẬP TỐT NGHIỆP TC38, NC3 (2012) GV: Bùi Thị Hạnh Tổ Công nghệ Thông tin Khoa Công nghệ Ngày 24/6/2012 1 I. Kiểu dữ liệu cơ bản trong C++ II. Cấu trúc điều khiển III. Các kiểu dữ liệu có cấu trúc PHƢƠNG PHÁP LẬP TRÌNH 2 I. Kiểu dữ liệu cơ bản Tên kiểu Kthước Miền giá trị Ghi chú Char 01 byte -128 đến 127 Có thể dùng như số nguyên 1 byte có dấu hoặc kiểu ký tự unsign char 01 byte 0 đến 255 Số nguyên 1 byte không dấu Int 02 byte -32738 đến 32767 unsign int 02 byte 0 đến 65335 Có thể gọi tắt là unsign Long 04 byte -232 đến 231 -1 unsign long 04 byte 0 đến 232-1 Float 04 byte 3.4E-38  3.4E38 Giới hạn chỉ trị tuyệt đối.Các giá trị <3.4E-38 được coi = 0. Tuy nhiên kiểu float chỉ có 7 chữ số có nghĩa. Double 08 byte 1.7E-308  1.7E308 long double 10 byte 3.4E-4932 1.1E4932 Ép kiểu  Thường sử dụng khi gán biểu thức gồm các toán hạng khác kiểu. Vd:  Muốn có giá trị chính xác trong phép chia hai số nguyên cần dùng phép ép kiểu : ((float)a)/b  Để đổi giá trị thực r sang nguyên, ta dùng : (int)(r+0.5) 4 Các toán tử đặc biệt  Toán tử tăng giảm k=5;++k + 10 ;// được 16 k++ +10; //được 15 --k+10; //được 14 k--+10; //được 15  Toán tử điều kiện toán hạng 1 ? toán hạng 2 : toán hạng 3 Vd: int m = 1, n = 2; int min = (m < n ? m : n); // min nhận giá trị 1  Toán tử sizeof(x): Trả lại số bye mà x chiếm trong bộ nhớ 5 II. Cấu trúc điều khiển  Tuần tự  Phân nhánh Không điều kiện : goto , break , continue , return Có điều kiện : if ; switch  Lặp :  for while  do … while 6 Goto  Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn  Cách sử dụng lệnh goto: Tạo một nhãn goto đến nhãn 7 main() { int i = 0; lap: // nhãn cout<<i<<“:”; i++; if ( i < 10 ) goto lap; // nhãy về nhãn lap return 0; } i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9 8 Câu lệnh if if (biểu thức điều kiện) { .... } [else { ... }] 9 int s; s = 3; s += 1; if (s > 5) { cout<<s; } else { cout<<s * 10; } 10 Câu lệnh switch switch (biểu thức điều kiện) { case : [default: ] } 11 int diem=7; switch (diem) { case 3: { cout<<"Yeu"; break; } case 5: { cout<<"Trung binh"; break; } default: { cout<<"Khong biet"; break; } } 12 Câu lệnh for for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp]) { ; ; ; } 13 for (int i = 2; i < 10; i++) { for (int j = 1; j <= 10; j++) { cout<<i<<"x“<<j<<"=“<<i*j<<" \n "); } } 14 Câu lệnh while while (Biểu thức) { ; ; ; } true false Các câu lệnh thực hiện Điều kiện 15 char pass = "ABCD"; char chuoi[5]; int solan; solan = 0; while (solan < 3) { cout<<"Nhap pass : "; gets(chuoi); if strcmp(chuoi, pass) { cout<<"Dung roi"; solan = 4; } else { cout<<"Sai roi"; solan += 1; } } 16 Câu lệnh do/while do { ; ; ; } while ( điều kiện ) true false Các câu lệnh thực hiện Điều kiện 17 main() { int i = 11; do { cout<<i; i++; } while ( i < 10 ); } 18 III. Kiểu dữ liệu có cấu trúc 1. Kiểu chuỗi ký tự: Chuỗi ký tự trong C được cấu trúc như một chuỗi liên tiếp các ký tự kết thúc bằng ký tự có mã ASCII bằng 0 (NULL character). Như vậy, giới hạn chiều dài của một chuỗi ký tự trong C là 1 Segment (tối đa chứa 65335 ký tự), ký tự đầu tiên được đánh số là ký tự thứ 0. char S[10]; //Khai báo một chuỗi ký tự S có chiều dài // tối đa 10 (kể cả kí tự kết thúc) char S[]="ABC";// Khai báo một chuỗi ký tự S có chiều // dài bằng chiều dài của chuỗi "ABC" // và giá trị khởi đầu của S là "ABC" 19 2. Kiểu mảng: Kiểu dữ liệu mảng là kiểu dữ liệu trong đó mỗi phần tử của nó là một tập hợp có thứ tự các giá trị có cùng cấu trúc được lưu trữ liên tiếp nhau trong bộ nhớ. Mảng 1 chiều: [<Số phần tử>]; Ví dụ int a[100]; int a[5] = (1, 7, -3, 8, 19); int a[] = (1, 7, -3, 8, 19); Mảng 2 chiều hay nhiều chiều: [][]...; int a[100][150]; int a[][]={{1, 7, -3, 8, 19}, {4, 5, 2, 8, 9}, {21, -7, 45, -3, 4}}; 20 3. Kiểu cấu trúc là kiểu dữ liệu mà trong đó mỗi phần tử của nó là tập hợp các giá trị có thể khác cấu trúc. typedef struct { ; ; … }[]; Vd: struct nguoi {char HoTen[35]; int NamSinh; char NoiSinh[40]; char GioiTinh; char DiaChi[50]; char Ttgd; }NGUOI; 21 4. Kiểu con trỏ * Vd: int a, b, *pa, *pb; =& định vị con trỏ đến địa chỉ của một biến đang làm việc. * nội dung ô nhớ. 22 int main() { int a=2,b=3,c=4; int *x=&a; //x=2 int *y; *x=11; //a=11 y=&c; //y=4 c++; //c=5, y=5 x=&b; //x=3 b--;//b=2, x=2 cout<<a<<” “<<b<<endl; cout<<*x<<” “<<*y<<endl; return 0; } 11 2 2 5 23 Con trỏ và mảng * Con trỏ và mảng 1 chiều: //nhập phần tử mảng for(i=0;i<n;i++) { cout<<"Phan tu thu “<<i<<“:”;cin<<a+i; } //in ra mảng for(i=0;i<n;i++) cout<<*(a+i)<<“ “; * Con trỏ và mảng 2 chiều float *pa= (float*) calloc(m*n,sizeof(float)); Để truy nhập đến phần tử pa[i][j] trong thân hàm, dùng công thức: *(pa+ i*n + j) //n là số cột 24 Con trỏ và tham chiếu của hàm Khi nào sử dụng đối con trỏ (tham chiếu) Khi muốn bảo lƣu lại kết quả tính toán đƣợc của các đối số trong hàm để sử dụng cho chƣơng trình gọi hàm có đối số thì chúng ta phải khai báo đối số của hàm là tham chiếu (con trỏ hay dạng địa chỉ). 25 #include #include void HoanVi(int *a, int *b) { int c=*a; *a=*b; *b=c; } int main() { int m=20,n=30; clrscr(); cout<<"Truoc khi goi ham m=“<<m<<“ n=“<<n; HoanVi(&m,&n); cout<<"Sau khi goi ham m=“<<m<<“ n=“<<n; getch(); return 0; } 26 Con trỏ và cấu trúc -> (*). Ví dụ: struct Diem diemA={0,0}; struct Diem *pDiem; pDiem = &diemA; pDiem -> x = 5; (*pDiem). y = 10; 27 I. Các giải thuật tìm kiếm II. Các giải thuật sắp xếp III. Đệ quy IV. Danh sách đặc V. Danh sách liên kết đơn VI. Ngăn xếp (Stack) – Hàng đợi (Queue) VII. Danh sách liên kết đôi VIII. Cây nhị phân IX. Cây nhị phân tìm kiếm CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 28 I. Các giải thuật tìm kiếm  Tìm tuần tự (Tìm tuyến tính) (Linear Search) int LinearSearch (int a[], int n, int x) { int k = 0; a[n]=x; while (a[k] != x) k++; if (k <n) return (k);// trả về vị trí tìm thấy else return (-1); } 29  Tìm nhị phân (Binary Search) int BinarySearch( int a[], int n, int x) { int left=0, right=n-1, mid; do { mid=(left+right)/2; if(x==a[mid]) return(mid); if(x<a[mid]) right=mid-1; else left=mid+1; } while(left<=right); return (-1); } 30 II. Các giải thuật sắp xếp 1. Đổi chỗ (Interchange Sort) 2. Nổi bọt (Bubble Sort) 3. Chèn (Insertion Sort) 4. Chọn (Selection Sort) 5. Nhanh (Quick Sort) 31 1. Interchange Sort  Đi từ đầu tiên, nếu có phần tử nào sau nó nhỏ hơn thì thực hiện đổi chỗ.  void InterchangeSort(int a[], int N ) { int i, j; for (i = 0 ; i<N-1 ; i++) for (j =i+1; j < N ; j++) if(a[j ]< a[i]) // nếu có sự sai vị trí thì đổi chỗ Doicho(a[i],a[j]); } 32 33 Interchange Sort – Ví dụ 2 8 5 1 6 4 15 12 2 3 4 5 6 7 8 1 i j 1 34 Interchange Sort – Ví dụ 12 8 5 2 6 4 15 1 2 3 4 5 6 7 8 1 i j 2 35 Interchange Sort – Ví dụ 2 12 8 5 6 4 15 1 2 3 4 5 6 7 8 1 i j 4 36 Interchange Sort – Ví dụ 2 4 12 8 6 5 15 1 2 3 4 5 6 7 8 1 i j 5 37 Interchange Sort – Ví dụ 2 4 5 6 8 12 15 1 2 3 4 5 6 7 8 1 2. Buble Sort  Xuất phát từ cuối dãy đổi chỗ các cặp phần tử kế cận để đưa phần tử nhỏ hơn trong cặp phần tử đó về vị trí đúng đầu dãy hiện hành  void BubleSort(int a[], int n) { int i, j; for (i = 0 ; i<n-1 ; i++) for (j =n-1; j >i ; j --) if(a[j]< a[j-1])// nếu sai vị trí thì đổi chỗ Doicho(a[j],a[j-1]); } 38 39 Bubble Sort – Ví dụ 2 8 5 1 6 4 15 12 2 3 4 5 6 7 8 1 i j 1 40 Bubble Sort – Ví dụ 12 2 8 5 4 6 15 1 2 3 4 5 6 7 8 1 i j 2 41 Bubble Sort – Ví dụ 2 12 4 8 5 6 15 1 2 3 4 5 6 7 8 1 i j 4 42 Bubble Sort – Ví dụ 2 4 12 8 5 6 15 1 2 3 4 5 6 7 8 1 i j 5 43 Bubble Sort – Ví dụ 2 4 5 12 8 6 15 1 2 3 4 5 6 7 8 1 i j 6 44 Bubble Sort – Ví dụ 2 4 5 6 12 8 15 1 2 3 4 5 6 7 8 1 i j 8 45 Bubble Sort – Ví dụ 2 4 5 6 8 12 15 1 2 3 4 5 6 7 8 1 i j 3. Insertion Sort  Giả sử có một dãy a1 , a2 ,... ,an trong đó i phần tử đầu tiên a1 , a2 ,... ,ai-1 đã có thứ tự.  Tìm cách chèn phần tử ai vào vị trí thích hợp của đoạn đã được sắp để có dãy mới a1 , a2 ,... ,ai trở nên có thứ tự. 46 47 Insertion Sort – Ví dụ 2 8 5 1 6 4 15 12 2 3 4 5 6 7 8 1 48 2 8 5 1 6 4 15 12 i x 2 3 4 5 6 7 8 1 pos 2 Insertion Sort – Ví dụ Insert a2 into (1, 2) 49 12 8 5 1 6 4 15 2 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a3 into (1, 3) 8 50 8 12 5 1 6 4 15 2 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a4 into (1, 4) 5 51 5 8 12 1 6 4 15 2 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a5 into (1, 5) 1 52 2 5 8 12 6 4 15 1 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a6 into (1, 6) 6 53 2 5 6 8 12 4 15 1 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a7 into (1, 7) 4 54 2 4 5 6 8 12 15 1 i x 2 3 4 5 6 7 8 1 pos Insertion Sort – Ví dụ Insert a8 into (1, 8) 55 2 4 5 6 8 12 15 1 pos 2 3 4 5 6 7 8 1 Insertion Sort – Ví dụ 4. Selection Sort  Chọn phần tử nhỏ nhất trong N phần tử ban đầu  Đưa phần tử này về vị trí đúng là đầu dãy hiện hành  Xem dãy hiện hành chỉ còn N-1 phần tử của dãy ban đầu  Bắt đầu từ vị trí thứ 2;  Lặp lại quá trình trên cho dãy hiện hành... đến khi dãy hiện hành chỉ còn 1 phần tử 56 57 Selection sort – Ví dụ 2 8 5 1 6 4 15 12 i min 2 3 4 5 6 7 8 1 Find MinPos(1, 8) Swap(ai, amin) 58 Selection sort – Ví dụ 2 8 5 12 6 4 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(2, 8) Swap(ai, amin) 59 Selection sort – Ví dụ 2 8 5 12 6 4 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(3, 8) Swap(ai, amin) 60 Selection sort – Ví dụ 2 4 5 12 6 8 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(4, 8) Swap(ai, amin) 61 Selection sort – Ví dụ 2 4 5 12 6 8 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(5, 8) Swap(ai, amin) 62 Selection sort – Ví dụ 2 4 5 6 12 8 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(6, 8) Swap(ai, amin) 63 Selection sort – Ví dụ 2 4 5 6 8 12 15 1 i min 2 3 4 5 6 7 8 1 Find MinPos(7, 8) Swap(ai, amin) 5. QuickSort  Sau khi thöïc hieän phaân hoaïch, daõy ban ñaàu ñöôïc phaân thaønh 3 ñoaïn:  a k < x , vôùi k = 0 .. (j-1)  a k = x , vôùi k = (j+1) .. (i-1)  a k > x , vôùi k = i..n  Ñeå saép xeáp caùc ñoaïn 1 vaø 3, ta laàn löôït tieán haønh vieäc phaân hoaïch töøng daõy con theo cuøng phöông phaùp phaân hoaïch daõy ban ñaàu vöøa trình baøy 64 65 Quick sort – Ví duï 2 8 5 1 6 4 15 12 2 3 4 5 6 7 8 1 left right 5 X STOP Not less than X i j STOP Not greater than X Phân hoạch dãy 66 Quick sort – Ví duï 2 8 5 1 6 12 15 4 2 3 4 5 6 7 8 1 left right 5 X STOP Not less than X i j STOP Not greater than X Phân hoạch dãy 67 Quick sort – Ví duï 2 1 5 8 6 12 15 4 2 3 4 5 6 7 8 1 left right i j 68 6 X Quick sort – Ví duï 2 4 5 8 6 12 15 1 2 3 4 5 6 7 8 1 left right i j STOP Not less than X STOP Not greater than X Sắp xếp đoạn 3 Phân hoạch dãy 69 Quick sort – Ví duï 2 4 5 6 8 12 15 1 2 3 4 5 6 7 8 1 left right i j Sắp xếp đoạn 3 III. Đệ quy Chương trình đệ qui gồm hai phần chính:  Phần neo: Điều kiện thoát khỏi đệ qui  Phần đệ quy: Trong phần thân chương trình có lời gọi đến chính bản thân chương trình với giá trị mới của tham số nhỏ hơn giá trị ban đầu 70  Cho hàm sau: int Func( int n ) { if (n == 5) return 5; else return 2 * Func(n + 1); } Cho biết kết quả khi gọi hàm Func(2) ? 71 IV. Danh sách đặc  Danh sách đặc là danh sách mà không gian bộ nhớ lưu trữ các phần tử nằm kề cận nhau trong bộ nhớ.  Sử dụng kiểu mảng để định nghĩa danh sách đặc.  Khai báo: VD: # define MaxLen 1000 //chiều dài tối đa int n; //chiều dài thực int a[MaxLen]; //khai báo danh sách a là 1 mảng với MaxLen phần tử tối đa 2 1 4 7 4 8 3 6 4 7 0 1 2 3 4 5 6 7 8 9 72 Các thao tác trong danh sách đặc  Thêm 1 phần tử vào danh sách tại vị trí pos  Hủy 1 phần tử khỏi danh sách  Tìm kiếm  Sắp xếp  Tách 73 Thêm 1 phần tử x vào ds tại vị trí pos  Kiểm tra chiều dài thực có = chiều dài tối đa?  Thực hiện đi từ cuối danh sách đến vị trí pos, gán giá trị thứ a[i]=a[i-1];  Đến vị trí pos, gán: a[pos]=x; chiều dài thực tăng lên 1. int Themphantu(int M[], int &n, int x, int pos) { if (Len == MaxLen) return (-1); for (int i= n; i >pos; i--) a[i] = a[i-1]; a[pos] = x; n++; return (n); } 74 Hủy 1 phần tử trong ds có vị trí del  Kiểm tra ds có rỗng và del>chiều dài thực?  Thực hiện đi từ vị trí del đến cuối dãy, gán giá trị a[i] cho giá trị đứng sau nó a[i+1];  Chiều dài thực giảm 1. int Xoaphantu(int a[], int &n, int del) { int (n ==0 || del >=Len) return (-1); for (int i =del; i<n-1; i++) a[i] = a[i+1]; n --; return (n); } 75 V. DSLK đơn( Singly Linked List)  DSLK đơn là chuỗi các node, được tổ chức theo thứ tự tuyến tính  Mỗi node gồm 2 phần:  Phần Data, information :lưu trữ các thông tin về bản thân phần tử.  Phần link hay con trỏ : lưu trữ địa chỉ của phần tử kế tiếp; nếu là cuối ds thì =NULL. Data Link Node 76 Khai báo typedef struct Node { int data; NODE * link; }NODE; typedef struct List { NODE* first; NODE* last; }LIST; 77 Các thao tác  Tạo 1 nút  Thêm 1 nút vào danh sách  Xóa 1 nút khỏi danh sách  Duyệt danh sách 78 Tạo 1 nút DSLK đơn NODE *GetNode(int x) { NODE *p; // Cấp phát vùng nhớ cho phần tử p = (NODE*)malloc(sizeof(NODE))//p= new NODE; if (p==NULL) { cout<<“Khong du bo nho!”; exit(1); } p->data = x; // Gán thông tin cho phần tử p p->link = NULL; return p; } 79 Thêm 1 nút vào đầu DSLK đơn new_ele->link = l.first; l.first = new_ele; A B C D E first last X new_ele 80 Thêm 1 nút vào cuối DSLK đơn l.last->link = new_ele; l.last = new_ele ; A B C D E first last X new_ele 81 Chèn 1 nút sau nút q new_ele->link = q->link; q->link = new_ele; A B C D E first last X new_ele q q->link 82 Xóa 1 nút đầu DSLK đơn if (l.first !=NULL) { NODE* p=l.first; l.first=p->link; if(l.first == NULL) l.last=NULL;//Nếu ds rỗng free(p); //delete p; } A B C D E first last p 83 Xóa 1 nút sau nút q trong DSLK đơn if(q !=NULL && q->link !=NULL) { NODE* p = q->link; q->link = p->link; if(p==l.last) l.last=q; free(p); } A B C D E first last q p 84 Duyệt DSLK đơn NODE* p=l.first; while(p!=NULL) { coutdata<<“\t”; p=p ->link; //trỏ đến phần tử kế tiếp } 85 VI. Ngăn xếp (Stack) – Hàng đợi (Queue)  Stack là cấu trúc dữ liệu làm việc theo cơ chế LIFO (Last In First Out)  Việc thêm (push) hoặc lấy (pop) thực hiện theo cơ chế Vào sau Ra trước và thực hiện tại 1đầu của Stack.  Hiện thực Stack có thể có thể dùng kiểu mảng hoặc DSLK Stack 86 Hàng đợi (Queue) 87  Queue là cấu trúc dữ liệu làm việc theo cơ chế LIFO (Fisrt In First Out)  Việc thêm (Enqueue) hoặc lấy (Dequeue) thực hiện theo cơ chế Vào trước Ra trước.  Việc thêm vào luôn diễn ra ở cuối queue và việc lấy ra luôn diễn ra ở đầu queue.  Hiện thực Queue có thể có thể dùng kiểu mảng hoặc DSLK 88 VII. DSLK đôi (Doubly Linked List)  Là danh sách mà mỗi node trong ds kết nối với node đứng trước và node đứng sau trong ds. A B C D 89 VII. DSLK đôi (Doubly Linked List)  Là danh sách mà mỗi node trong ds kết nối với node đứng trước và node đứng sau trong ds. A B C D 90 Khai báo DSLK đôi typedef struct DNODE { Data Info; DNode* pPre; // lưu trữ địa chỉ của node trước DNode* pNext;// ưu trữ địa chỉ của node sau }; typedef struct DLIST { DNODE* first; // con trỏ trỏ đến đầu ds DNODE* last; // con trỏ trỏ cuối ds }; 91 Tạo 1 node DNODE* GetNode(Data x) { DNODE *p; p = new DNODE; if ( p==NULL) return NULL; p->Info = x; p->pPrev = p->pNext = NULL; return p; } 92 Chèn vào đầu và cuối DSLK đôi new_ele->pNext = l.first; // (1) l.first->pPrev = new_ele; // (2 l.first = new_ele; // (3) X first last A B C D (1) (2) (3) X first last A B C D (1) (2) (3) l.last->Next = new_ele; // (1) new_ele->pPrev = l.last; //(2) l.last = new_ele; // (3) 93 Chèn vào sau node q DNODE *p=q->pNext; new_ele->pNext = p;//(1) new_ele->pPrev = q//(2) if(p != NULL) p->pPrev = new_ele; //(3) q->pNext = new_ele; //(4) X first last A B C D (1) (2) (4) (3) q 94 Chèn vào trƣớc node q DNODE *p=q->pPrev; new_ele->pNext = q;//(1) new_ele->pPrev = p;//(2) q->pPrev = new_ele;//(3) if(p != NULL) p->pNext = new_ele;//(4) X first last A B C D (1) (2) (3) (4) q 95 Hủy phần tử đầu và cuối DSLK đôi  Gán node tạm chứa địa chỉ node đầu hoặc cuối.  Cắt bỏ các mối liên kết  Xóa node tạm Code xóa node đầu DSLK đôi: p = l.first; l.first = l.first->pNext; l.first->pPrev = NULL; delete p; Code xóa node cuối DSLK đôi: p = l.last; l.last = l.last->pPrev; l.last->pNext = NULL; delete p; 96 Hủy node trƣớc hoặc sau node q  Cắt bỏ các mối liên kết với node trước hoặc sau q  Xóa node trước hoặc sau q Code xóa node trước q p = q ->pPrev; q->pPrev = p->pPrev; p->pPrev->pNext = q; delete p; Code xóa node sau q: p = q ->pNext ; q->pNext = p->pNext; p->pNext->pPrev = q; delete p; 97 VIII. Cây, cây nhị phân Gốc(root) Nút trong lá cha và con 98 Các khái niệm  Bậc của một nút : là số cây con của nút đó  Bậc của một cây : là bậc lớn nhất của các nút trong cây. Cây có bậc n thì gọi là cây n-phân.  Nút gốc : là nút không có nút cha.  Nút lá : là nút có bậc bằng 0 .  Nút trong : là nút có bậc khác 0 và không phải là gốc .  Mức của một nút:  Mức (gốc (T) ) = 0.  Gọi T1, T2, T3, ... , Tn là các cây con của T0 Mức (T1) = Mức (T2) = ... = Mức (Tn) = Mức (T0) + 1.  Chiều cao (chiều sâu – depth) của cây là mức cao nhất của cây + 1. 99 24/06/2012 100 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len A Tree Has Levels LEVEL 0 24/06/2012 101 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Level One LEVEL 1 24/06/2012 102 Owner Jake Manager Chef Brad Carol Waitress Waiter Cook Helper Joyce Chris Max Len Level Two LEVEL 2 24/06/2012 103 Cây nhị phân  Cây nhị phân là cây mỗi