Tải bản đầy đủ (.pptx) (63 trang)

Cây nhị phân và Ứng dụng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.23 MB, 63 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>CÂY NHỊ PHÂN</b>

Nhóm 2:

Trần Nguyễn Đắc LãmNgơ Duy Thành LongHà Minh Khánh

Nguyễn Đình HồngNguyễn Vũ Khương

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>CÂY NHỊ PHÂN</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<i><b>Khái niệm: Cây (tree) là 1 tập hợp hữu hạn các nút trong đó có 1 nút đặc </b></i>

<i>biệt gọi là nút gốc (root). Giữa các nút có 1 quan hệ phân cấp gọi là “quan </i>

hệ cha con”.

<b>Định nghĩa đệ quy:</b>

 Một nút là 1 cây. Nút đó cũng là gốc của cây đó.

 Nếu n là 1 nút và T<b><sub>1</sub></b>, T<b><sub>2</sub></b>, …, T<b><sub>k</sub></b> là các cây với n<b><sub>1</sub></b>, n<b><sub>2</sub></b>, …, n<b><sub>k</sub></b> lần lượt là các gốc, thì 1 cây mới T sẽ được tạo lập bằng cách cho n trở thành cha của các nút n<b><sub>1</sub></b>, n<b><sub>2</sub></b>, …, n<b><sub>k</sub></b>; nghĩa là n là gốc còn T<b><sub>1</sub></b>, T<b><sub>2</sub></b>, …, T<b><sub>k</sub></b> là các các

<i>cây con (subtrees) của gốc. Lúc đó n</i><b><sub>1</sub></b>, n<b><sub>2</sub></b>, …, n<b><sub>k</sub></b> là con của nút n.

<i><b>Quy ước: Cây khơng có nút nào ta gọi là cây rỗng (null tree). </b></i>

<b>1.KHÁI NIỆM</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<small> </small>

<b><small> T2</small></b>

 Những nút không phải là lá được gọi là nút nhánh (branch).

 Cấp cao nhất của một nút trên cây gọi là cấp của cây đó.

<b>1.KHÁI NIỆM</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

 Chiều cao (height) hay chiều sâu (depth) của một cây là số mức lớn nhất của nút có trên cây

<small>4</small>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Biểu diễn lịch thi đấu

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>( A / B + C )*( D – E )</b>

BA

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>2.1 Khái niệm và tính chất2.2 Biểu diễn cây nhị phân2.3 Phép duyệt cây nhị phân</b>

<b>2. CÂY NHỊ PHÂN</b>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>2.1 Khái niệm và tính chất</b>

<b>Khái niệm: Cây nhị phân là một dạng quan trọng của cấu trúc cây. Mọi nút </b>

trên cây chỉ có tối đa hai nhánh con. Với một nút, ta phân biệt cây con trái và cây con phải của cây. Cây nhị phân là cây có tính đến thứ tự của các nhánh con.

<small>CB</small>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>Các cây nhị phân suy biến</b>

<small>Cây lệch phải</small>

<small>Cây zíc-zắc</small>

<small>Cây zíc-zắc</small>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>Các cây nhị phân hoàn chỉnh và đầy đủ</b>

<small>Complete binary treeFull binary tree</small>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>2.1 Biểu diễn cây nhị phân </b>

Biểu diễn bằng mảng

Biểu diễn bằng cấu trúc liên kết

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>Biểu diễn bằng mảng</b>

Nếu có một cây nhị phân đầy đủ, ta đánh số các nút trên cây theo thứ tự từ mức 1 trở đi, hết mức này đến mức khác từ trái sang phải đối với các nút ở mỗi mức

Ta thấy:

 Con của nút thứ i là nút thứ 2i và 2i + 1

 Cha của nút thứ j là nút j div 2

Từ đó có thể lưu trữ cây bằng một mảng T, nút thứ i của cây được lưu trữ bằng phần tử T[i]

<small>3</small>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<b>Biểu diễn bằng mảng</b>

<b>Trường hợp cây nhị phân không đầy đủ:</b>

1. Thêm một số nút giả để được cây nhị phân đầy đủ và gán những giá trị đặc biệt cho những nút này

2. Hoặc thêm một mảng phụ để đánh dấu những nút nào là nút giả mà ta thêm vào

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>Biểu diễn bằng mảng</b>

<b>Nhược điểm: Với cây nhị phân không </b>

đầy đủ, ta sẽ gặp phải sự lãng phí bộ nhớ vì có thể sẽ phải thêm rất nhiều nút giả thì mới được cây nhị phân đầy đủ

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>Biểu diễn bằng cấu trúc liên kết</b>

Khi biểu diễn cây nhị phân bằng cấu trúc liên kết, mỗi nút (node) là một bản ghi (record) gồm ba trường:

 Trường Info: chứa giá trị lưu tại nút đó.

 Trường Left: Chứa liên kết (con trỏ) trỏ tới cây nhị phân bên trái của node.

 Trường Right: Chưa liên kết (con trỏ) trỏ tới cây nhị phân bên phải của node.

Nếu một cây nhị phân trống, nó sẽ được biểu diễn thành con trỏ NULL.

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<b>Biểu diễn bằng cấu trúc liên kết</b>

Cấu trúc node của cây:

Khai báo node bằng cấu trúc liên kết (con trỏ):

<small>structTnode {</small>

<small>    charword[20];</small>

<small>    structTnode*left;    structTnode*right;};</small>

<small>Leff pointerRight pointer</small>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>Biểu diễn bằng cấu trúc liên kết</b>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

MakeNode

<small>Node* makeNode(char*word){</small>

<small> // Phân bổ( bộ nhớ cho nút mới    Node* newNode = NULL;</small>

<small>    newNode = (Node*)malloc(sizeof(Node)); // Kiể(m tra câ2p phát bộ nhớ có thành cổng    if (newNode == NULL){</small>

<small>        printf("Out of memory\n");        exit(1);</small>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<small>    charword[20] = "a";    if(flag == true){</small>

<small>        printf("Node: ");</small>

<small>        flag = false;// Chỉ( nhập nút gổ2c 1 lâIn duy nhâ2t    }</small>

<small>    scanf("%s",word);</small>

<small> //Nể2u word == "~" thì khổng nhập nút tiể2p theo</small>

<small>    if (strcmp(word,"~")==0) returnNULL;    tree =  makeTreeNode(word);</small>

<small>    printf("Input left child of %s: ",word);    tree->left= Insert(tree->left);</small>

<small>    printf("Input right child of %s: ",word);    tree->right=Insert(tree->right);</small>

<small>    returntree;       }</small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<b>Tính số nút và chiều cao của cây</b>

<small>// Hàm tính sổ2 lượng nút cu(a câyint countNodes(Node*tree) {     if( tree == NULL ) return0;    else {</small>

<small>        intld = countNodes(tree->left);        intrd = countNodes(tree->right);        return1+ld+rd;</small>

<small>    } }</small>

<small>// Hàm tính chiểIu cao hay độ sâu cu(a cây</small>

<small>int depth(Node*tree) { </small>

<small>    if( tree == NULL ) return0;    intld = depth(tree->left);    intrd = depth(tree->right);    return1 + (ld > rd ? ld : rd);}</small>

<small>32</small>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<small>    free(tree);    return;</small>

<small>A</small>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b>Phép duyệt cây</b>

<b>Định nghĩa: Phép xử lý các nút trên cây mà ta gọi chung là phép thăm </b>

(Visit) các nút một cách hệ thống sao cho mỗi nút chỉ được thăm một lần gọi là phép duyệt cây.

 Nếu 1 nút khơng có nút con trái (hoặc phải) thì liên kết Left (Right) của nút đó được liên kết tới 1 nút đặc biệt là NULL.

 Nếu cây rỗng thì nút gốc của cây đó được gán bằng NULL.

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>Phép duyệt cây</b>

<b>Thứ tự trước (Preorder) NLR</b>

‑ <sub>Thăm nút (Visit a node)</sub>

‑ <sub>Thăm cây con trái theo thứ tự trước (Visit left subtree)</sub>‑ <sub>Thăm cây con phải theo thứ tự trước (Visit right subtree)</sub>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b>Preorder traversal</b>

<small>void printPreorder(Node*tree){</small>

<small>    if( tree != NULL )    { </small>

<small>        printf("%s  ", tree>word);</small>

<small>-  -  -  -  printPreorder(tree>left);</small>

<small>-  -  -  -  printPreorder(tree>right);</small>

<small>-  -  }}</small>

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b>Inorder traversal</b>

<small>void printInorder(Node*tree){</small>

<small>    if( tree != NULL )    {</small>

<small>        printInorder(tree->left);        printf("%s  ", tree-</small>

<small>        printInorder(tree>right);</small>

<small>-  -  }}</small>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<b>Postorder traversal</b>

<small>void printPostorder(Node*tree){</small>

<small>    if( tree != NULL )    {</small>

<small>        printPostorder(tree>left);</small>

<small>-  -  -  -  printPostorder(tree>right);</small>

<small>-  -  -  -  printf("%s  ", tree>word);</small>

<small>-  -  }}</small>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>Nhận xét</b>

Ta thấy tổ chức cây theo cấu trúc liên kết tỏ ra thích hợp hơn cách tổ chức bằng mảng 1 chiều.

Tuy nhiên, cũng có những nhược điểm:

 Tốc độ xử lý chậm hơn do chỉ có nút gốc của cây có thể được truy cập trực tiếp còn các nút khác chỉ được truy cập sau khi đã qua 1 số thao tác duyệt cây.

 Tốn bộ nhớ hơn do ngồi trường info phải có thêm trường left và right ở mỗi nút để lưu trữ địa chỉ nút con trái và nút con phải của nút đó.

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>3.1 Cây biểu diễn biểu thức (Expression Tree)3.2 Cây nhị phân tìm kiếm (Binary Search Tree)3.3 Cây BST cân bằng hoàn toàn</b>

<b>3.4 Cây AVL (Adelson-Velsky và Landis)</b>

<b>3.ỨNG DỤNG</b>

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b>Cây biểu diễn biểu thức</b>

 Cây biểu thức là một cây nhị phân, trong đó mỗi nút nhánh tương ứng với tốn tử và mỗi nút lá tương ứng với toán hạng.

 Ta sử dụng một trong các phép duyệt cây để tính giá trị biểu thức.

 Xét biểu thức (10/2+3)*(7-4), ta được cây như sau:

<small>210</small>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b>Cây biểu diễn biểu thức</b>

<b>Bước 1: Input biểu thức trung tố, chuẩn hoá trung tố và chuyển sang hậu tố </b>

<b>Bước 2: Khởi tạo một Stack rỗng dùng để chứa các nút của cây</b>

<b>Bước 3: Đọc lần lượt các phần tử của biểu thức LRN từ trái qua phải, với mỗi </b>

phần tử đó:

 Tạo ra một nút mới newNode chứa phần tử mới đọc được

 Nếu phần tử này là toán tử, lấy từ Stack ra hai nút ( theo thứ tự x và y), sau đó đem liên kết phải của newNode trỏ đến x, đem liên kết trái của newNode trỏ đến y

 Đẩy newNode vào Stack

<b>Bước 4: Sau khi kết thúc bước 2 thì toàn bộ biểu thức được đọc xong, trong Stack </b>

chỉ cịn duy nhất một phần tử, phần tử đó chính là gốc của cây nhị phân biểu diễn biểu thức

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

<b>Xây dựng cây biểu diễn biểu thức</b>

Bước 1:

Biểu thức LNR: (2+3)/5Biểu thức LRN: 2 3 + 5 /

<b><small>Đọc Xử lýstack exp</small></b>

<b><small>2</small></b> <small>Input “2” vào chuỗi exp(2</small>

<b><small>+</small></b> <sup>“+” có priority ≥ “(“ ở đỉnh Stack, </sup><sub>đẩy “+” vào Stack</sub> <small>(+2</small>

<b><small>3</small></b> <small>Input “3” vào chuỗi exp(+2 3</small>

<small>Lấy ra và input các phần tử trong Stack vào chuỗi exp tới khi gặp “(”</small>

<small>2 3 +</small>

<b><small>/</small></b> <small>Stack đang rỗng, đẩy “/” vào Stack /2 3 +</small>

<b><small>5</small></b> <small>Input “5” vào chuỗi exp/2 3 + 5</small>

<b><small>Hết</small></b> <sup>Pop các phần tử còn lại trong </sup><sub>Stack đưa vào chuỗi exp</sub> <small>2 3 + 5 /</small>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Các bước còn lại:

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b>Xây dựng cây biểu diễn biểu thức</b>

<small>void buildExpTree <Biể(u thức exp> {    structNode *x, *y, *z;</small>

<small>    for <Đọc phâIn tư( T từ biể(u thức exp> {        if <T là toán tư(> {</small>

<small>      z = newNode(T); x = pop(); y = pop();      z->right = x;</small>

<small>      z->left = y;      push(z);</small>

<small>        }</small>

<small>        else <T là toán hạng> {      z = newNode(T);</small>

<small>      push(z);        }</small>

<small>    }}</small>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<b>Tính tốn cây biễu diễn biểu thức</b>

<small>double evaluationNode(Node*root){    if(root == NULL) return0;</small>

<small>    // Nể2u root là nút lá, return vểI giá trị kiể(u double</small>

<small>    if(root->left == NULL && root->right == NULL)    return (double)atof(root->data);</small>

<small>    // Tính cây con bển trái</small>

<small>    doubleleftval = EvaluationNode(root->left);</small>

<small>    // Tính cây con bển pha(i</small>

<small>    doublerightval = EvaluationNode(root->right);</small>

<small>    // Kiể(m tra tốn tư( rổIi tính tốn</small>

<small>    if(*root->data == '+') returnleftval + rightval;    if(*root->data == '-') returnleftval - rightval;    if(*root->data == '*') returnleftval * rightval;    if(*root->data == '/') returnleftval / rightval;    return pow(leftval, rightval);</small>

<small>}</small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<b>Độ phức tạp tính tốn của evaluationNode</b>

Cách 1: Vì tính tốn giá trị biểu thức, ta phải duyệt qua tất cả các node, mỗi node một lần (Tương tự các phép duyệt cây).

Vậy độ phức tạp tính tốn là:

<small>5/</small>

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

<b>Độ phức tạp tính tốn của evaluationNode</b>

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<b>Độ phức tạp tính tốn của evaluationNode</b>

Tính giá trị của cây, ta phải tính giá trị của cây con bên trái (left child) và cây con bên phải(right child):

<small>doubleleftval = EvaluationNode(root->left);doublerightval = EvaluationNode(root->right);</small>

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">

<b>3.2 Cây nhị phân tìm kiếm</b>

<b>Khái niệm: Cây tìm kiếm nhị phân(Binary Search Tree, viết </b>

tắt: BST) là một cây nhị phân và có thêm các ràng buộc sau đây:

1. Giá trị của tất cả các Node ở cây con bên trái <= giá trị của Node gốc.

2. Giá trị của tất cả các Node ở cây con bên phải > giá trị của Node gốc.

3. Tất cả các cây con(bao gồm bên trái và phải) cũng đều phải đảm bảo 2 tính chất trên.

</div><span class="text_page_counter">Trang 44</span><div class="page_container" data-page="44">

<b>3.2 Cây nhị phân tìm kiếm</b>

</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45">

<b>3.2 Cây nhị phân tìm kiếm</b>

Cây tìm kiếm nhị phân là một cấu trúc dữ liệu hiệu quả cho phép chúng ta xây dựng nên một danh sách mà dữ liệu trên đó được sắp xếp:

 Nó được gọi là cây tìm kiếm nhị phân vì nó có thể được sử dụng để tìm kiếm sự hiện diện của một phần tử trong thời gian O(log (n)).

 Trong trường hợp xấu nhất, cây có thể bị suy biến thành một danh sách liên kết đơn với các thao tác có độ phức tạp O(n).

<b>Kết luận: Để có độ phức tạp giải thuật ln là O(lg(n)) cần có cải tiến </b>

cấu trúc của cây BST: cây nhị phân tìm kiếm cân bằng hồn tồn, cây AVL,...

</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">

<b>3.3 BST cân bằng hoàn toàn</b>

<b>Khái niệm: Cây nhị phân tìm kiếm cân bằng hồn tồn là cây nhị </b>

phân tìm kiếm (BST) mà tại mỗi nút của nó, số nút của cây con trái chênh lệch không quá 1 so với số nút của cây con phải.

<b>Đánh giá: </b>

 Nếu cây cân đối thì việc tìm kiếm sẽ nhanh.

 Đối với cây cân bằng hồn tồn có N nút, trong trường hợp xấu nhất chỉ phải tìm qua log<sub>2</sub>N phần tử.

</div><span class="text_page_counter">Trang 47</span><div class="page_container" data-page="47">

<b>3.3 BST cân bằng hoàn toàn</b>

<small>9</small>

</div><span class="text_page_counter">Trang 48</span><div class="page_container" data-page="48">

<b>3.3 BST cân bằng hồn tồn</b>

Nếu thêm khóa <b>11</b> vào cây BST thì cây khơng cịn cân bằng hồn tồn nữa.

</div><span class="text_page_counter">Trang 50</span><div class="page_container" data-page="50">

<b>3.4 Cây AVL</b>

<b>Khái niệm: Cây nhị phân tìm kiếm cân bằng (AVL) là cây BST mà </b>

tại mỗi nút của nó độ cao của cây con trái và của cây con phải chênh lệch không quá 1.

<small>Binary Search TreeAVL Tree</small>

</div><span class="text_page_counter">Trang 51</span><div class="page_container" data-page="51">

<b>Xây dựng AVL Tree</b>

Để xây dựng được cây AVL thì các bạn nắm rõ các yếu tố sau:

</div><span class="text_page_counter">Trang 52</span><div class="page_container" data-page="52">

<b>Khái niệm “chiều cao”</b>

(4)

Tính chiều cao qua hàm đệ quy:<small>int getHeight(Node*root) {    if (root == NULL)</small>

<small>        return0;</small>

<small>    return1 + max(getHeight(root>left), getHeight(root->right));}</small>

-Chiều cao của một Node chính là số các node trên một đường dẫn dài nhất từ Node đó đến Node = NULL. Và quy ước Node = NULL có chiều cao bằng 0.

</div><span class="text_page_counter">Trang 53</span><div class="page_container" data-page="53">

<b>Các kỹ thuật quay cây AVL</b>

1. Kỹ thuật quay phải (áp dụng cho cây lệch trái)2. Kỹ thuật quay trái (áp dụng cho cây lệch phải)

</div><span class="text_page_counter">Trang 54</span><div class="page_container" data-page="54">

<b>1. Kỹ thuật quay phải</b>

<small>Cập nhật lại chiều cao:</small>

<small>height (root) = 1 + max (1, 1) = 2height (X) = 1 + max (root, 2) = 3</small>

<small>(2)</small>

</div><span class="text_page_counter">Trang 55</span><div class="page_container" data-page="55">

<small>Node* rightRotate(Node*root){    Node* x = root->left;</small>

<small>    // Bắ2t đâIu quay pha(i</small>

<small>    root->left = x->right;    x->right = root;</small>

<small>    // Thiể2t lập chiểIu cao</small>

<small>    root->height = 1 + max(getHeight(root->left), getHeight(root->right));</small>

<small>    x->height = 1 + max(getHeight(x->left), getHeight(x>right));</small>

<small>    // Return x - tra( vểI root mới</small>

<small>    returnx;}</small>

<b>1. Kỹ thuật quay phải</b>

</div><span class="text_page_counter">Trang 56</span><div class="page_container" data-page="56">

<b>2. Kỹ thuật quay trái</b>

<small>Y.left = rootCập nhật lại chiều cao:</small>

<small>height (root) = 1 + max (1, 1) = 2height (Y) = 1 + max (root, 2) = 3</small>

<small>(3)</small>

</div><span class="text_page_counter">Trang 57</span><div class="page_container" data-page="57">

<small>Node* leftRotate(Node*root) {    Node* y = root->right;</small>

<small>    // Bắ2t đâIu quay trái</small>

<small>    root->right = y->left;    y->left = root;</small>

<small>    // Thiể2t lập chiểIu cao</small>

<small>    root->height = 1 + max(getHeight(root->left), getHeight(root->right));</small>

<small>    y->height = 1 + max(getHeight(y->left), getHeight(y>right));</small>

<small>    // Return y - tra( vểI root mới</small>

<small>    returny;}</small>

<b>2. Kỹ thuật quay trái</b>

</div><span class="text_page_counter">Trang 58</span><div class="page_container" data-page="58">

<b>Các trường hợp cây bị lệch</b>

1. Trường hợp trái trái – left left2. Trường hợp trái phải – left right3. Trường hợp phải phải – right right4. Trường hợp phải trái – right left

</div><span class="text_page_counter">Trang 59</span><div class="page_container" data-page="59">

<b>1. Trường hợp trái trái – left left</b>

Có thể thấy rằng height(X) – height(Y) = 2 => cây bị lệch sang bên trái.

<b>value(Vàng) < value(X) => Node vàng nằm bên trái. => “Trái trái”.</b>

<b>Xảy ra khi: height(X) – height(Y) > 1 và value(Vàng) < value(X)Xử lý: quay phải Node root – rotateRight(root)</b>

</div><span class="text_page_counter">Trang 60</span><div class="page_container" data-page="60">

<b>2. Trường hợp trái phải – left right</b>

Cây đã bị lệch sang bên trái. Node vàng nằm bên phải so với Node X

<small>23AVL Tree</small>

<small>Left left case</small>

<b>Xảy ra khi: height(X) – height(Y) > 1 và value(Vàng) > value(X)Xử lý: rotateLeft(X) => rotateRight(root)</b>

</div><span class="text_page_counter">Trang 61</span><div class="page_container" data-page="61">

<b>3. Trường hợp phải phải – right right</b>

</div><span class="text_page_counter">Trang 62</span><div class="page_container" data-page="62">

<b>4. Trường hợp phải trái – right left</b>

Cây đã bị lệch sang bên phải. Node vàng nằm bên trái so với Node Y

<small>rotateRight(Y)</small> <sub>rotateLeft(root)</sub>

<b>Xảy ra khi: height(X) – height(Y) < -1 và value(Vàng) < value(Y)Xử lý: rotateRight(Y) -> rotateLeft(root)</b>

</div><span class="text_page_counter">Trang 63</span><div class="page_container" data-page="63">

<i><b>Thank you for </b></i>

<i><b>watching! </b></i>

</div>

×