13/6/15

Cách vẽ lại cây nhị phân tìm kiếm từ kết quả duyệt

Thường có 3 cách duyệt cơ bản là tiền thứ tự (NLR), trung thứ tự (LNR) và hậu thứ tự (LRN). Với kết quả duyệt kiểu NLR và LRN ta có thể vẽ lại cây ban đầu dễ dàng. Còn với LNR, ta không tìm được Node gốc nên không thể vẽ lại cây.

Nguyên tắc chung để vẽ lại cây
1. Tìm Node gốc.
2. Tìm đoạn lớn hơn Node gốc sẽ là nhánh phải, đoạn nhỏ hơn Node gốc sẽ là nhánh trái.
(Vì nguyên tắc của cây nhị phân tìm kiếm, Node gốc sẽ có khóa lớn hơn tất cả Node con nhánh bên trái và nhỏ hơn tất cả các Node ở nhánh phải)
3. Với mỗi đoạn vừa tìm được, tìm Node gốc của từng đoạn và tiếp tục tìm đoạn lớn hơn và nhỏ hơn Node gốc.

Đó là nguyên tắc chung để vẽ lại cây. Với cách duyệt NLR, ta luôn có Node gốc là Node đầu tiên của dãy kết quả, còn cách duyệt LRN là Node cuối cùng.

VD: Cho kết quả duyệt LRN: 5 3 7 9 8 11 6 20 19 37 25 21 15 12
Nhìn vào kết quả duyệt ta dễ dàng thấy 12 sẽ là Node gốc. Đoạn 5 đến 6 sẽ là nhánh trái và 20 đến 15 sẽ là nhánh phải.

Tiếp tục xét đoạn trái, ta thấy số 6 sẽ là Node gốc tiếp theo, tìm đoạn nhỏ hơn số 6 là [5,3] sẽ là nhánh trái, đoạn [7,11] sẽ là nhánh phải.
Cứ tiếp tục xét như thế đến hết ta sẽ vẽ được nhánh trái của cây.

Giờ ta xét nhánh phải với nguyên tắc tương tự. 15 sẽ là Node gốc tiếp theo, vì không có số nào nhỏ hơn 15 ở đoạn phải nên những số còn lại hoàn toàn nằm ở nhánh phải của 15. Xét tiếp đoạn đó tương tự ta sẽ vẽ được nhánh phải.


Các bạn hãy thử sức với các bài tập sau nhé.
Vẽ lại cây nhị phân tìm kiếm từ kết quả duyệt:
NLR: 7 6 4 15 13 9 14 30 31


22 nhận xét:

  1. Thế vẽ theo kết quả duyệt là LNR thì làm sao xác định được N hả bạn???

    Trả lờiXóa
    Trả lời
    1. Đối với LNR node gốc nằm ở giữa nhưng bạn sẽ không biết được nó nằm giữa như thế nào. Vì vậy rất khó dựng lại cây nhị phân với kết quả LNR

      Xóa
    2. Nặc danh17:06 15/12/17

      muc dich LNR la sap xep theo thu tu tang dan thoi

      Xóa
  2. Cám ơn người đăng rất nhiểu. Thường thì khi làm bài LNR hay RNL chủ yếu dựa vào may mắn và phán đoán.
    (Không biết người đăng học trường nào, sao tự dưng có linh cảm học chung trường! ĐH CNTT - ĐHQG TP HCM)

    Trả lờiXóa
    Trả lời
    1. Đúng là mình học ĐH CNTT bạn ạ =]]

      Xóa
    2. Nặc danh17:27 12/6/18

      lại gặp đàn anh rồi

      Xóa
  3. Nặc danh08:24 18/10/17

    Cám ơn bạn. Nhưng mà mình k rõ 1 chỗ là "Đoạn 5 đến 6 sẽ là nhánh trái và 20 đến 15 sẽ là nhánh phải." làm sao để biết đoạn 5 đến 6 là nhánh trái vậy.

    Trả lờiXóa
    Trả lời
    1. Chào bạn!
      Với kết quả duyệt ban đầu là LRN thì theo quy tắc ta sẽ được "N" (node gốc) ở vị trí cuối cùng, tức là 12, vậy ta tìm những số nào nhỏ hơn 12 sẽ là "L" (left), còn phần còn lại lớn hơn 12 là "R" (right). Vì vậy đoạn 5 đến 6 sẽ là nhánh trái và 20 đến 15 là nhánh phải. Ta tiếp tục thực hiện với từng nhánh theo cách tương tự để được cây kết quả cuối cùng.

      Xóa
  4. Cách tìm node gốc như nào bạn???

    Trả lờiXóa
    Trả lời
    1. LRN thì node gốc là số cuối dãy, NLR thì node là số đầu dãy, LNR thì node là số giữa dãy và không thể tìm chình xác.

      Xóa
  5. Oh, add viết hay quá ạ. Cảm ơn add nhiều lắm ạ. Mình cũng là uit nè. K12

    Trả lờiXóa
  6. tại sao 12 lại là node gốc vậy.

    Trả lờiXóa
  7. Cảm ơn a nhiều, dễ hiểu quá a ơi <3

    Trả lờiXóa
  8. nếu số bị trùng thì sẽ như thế nào

    Trả lờiXóa
  9. Em chọn node gốc là phầm phần tử đầu tiên, các số sau em xét lần lượt, nhỏ hơn em cho sáng trái, lớn hơn em cho sáng phải đc ko ạ?? Em toàn làm vậy

    Trả lờiXóa
  10. Làm sao biết đc 12 là gốc gốc vậy ạ

    Trả lờiXóa
    Trả lời
    1. Với cách duyệt NLR, ta luôn có Node gốc là Node đầu tiên của dãy kết quả, còn cách duyệt LRN là Node cuối cùng.
      Đề bài cho là LRN bạn nhé.

      Xóa
  11. Dạ em xin chào.. Chuyện là em muốn vẽ ra màn hình cây nhị phân gồm các hình tròn và các nhánh trong hình tròn là các giá trị đã được duyệt thì mình viết code như thế nào ạ

    Trả lờiXóa
  12. Nặc danh22:52 19/8/19

    óc lồn vẽ cây và cái kết

    Trả lờiXóa
  13. thế nếu chỉ là cây nhị phân không thôi thì dừng kiểu gì bạn?

    Trả lờiXóa
  14. Tìm gốc lnr thì sao ạ

    Trả lờiXóa