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
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Đố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óamuc dich LNR la sap xep theo thu tu tang dan thoi
XóaCá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.
Trả lờiXóa(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)
Đúng là mình học ĐH CNTT bạn ạ =]]
Xóalại gặp đàn anh rồi
XóaCá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óaChào bạn!
XóaVớ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.
Cách tìm node gốc như nào bạn???
Trả lờiXóaLRN 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óaOh, add viết hay quá ạ. Cảm ơn add nhiều lắm ạ. Mình cũng là uit nè. K12
Trả lờiXóatại sao 12 lại là node gốc vậy.
Trả lờiXóaCảm ơn a nhiều, dễ hiểu quá a ơi <3
Trả lờiXóanếu số bị trùng thì sẽ như thế nào
Trả lờiXóaKo có số bị trùng nhé bạn
XóaEm 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óaLàm sao biết đc 12 là gốc gốc vậy ạ
Trả lờiXóaVớ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.
XóaĐề bài cho là LRN bạn nhé.
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óc lồn vẽ cây và cái kết
Trả lờiXóathế nếu chỉ là cây nhị phân không thôi thì dừng kiểu gì bạn?
Trả lờiXóaTìm gốc lnr thì sao ạ
Trả lờiXóa