Đưa ra một danh sách các danh sách, hãy viết chương trình Python để chuyển đổi danh sách các danh sách đã cho thành một từ điển dạng cây
ví dụ
Input : [[1], [2, 1], [3, 1], [4, 2, 1], [5, 2, 1], [6, 3, 1], [7, 3, 1]] Output : {1: {2: {4: {}, 5: {}}, 3: {6: {}, 7: {}}}} Input : [['A'], ['B', 'A'], ['C', 'A'], ['D', 'C', 'A']] Output : {'A': {'C': {'D': {}}, 'B': {}}}
Phương pháp #1. Phương pháp Naive
Đây là phương pháp Naive trong đó chúng tôi sử dụng hai vòng lặp for để duyệt qua danh sách các danh sách. Chúng tôi khởi tạo 'cây' từ điển trống thành currTree và mỗi lần chúng tôi kiểm tra xem khóa [danh sách mục của danh sách] có được bao gồm trong currTree hay không. Nếu không, hãy đưa nó vào currTree, nếu không thì không làm gì cả. Cuối cùng, gán
{'A': {'B': {}, 'C': {'D': {}}}}7 cho
{'A': {'B': {}, 'C': {'D': {}}}}8.
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}0
{'A': {'B': {}, 'C': {'D': {}}}}1
{'A': {'B': {}, 'C': {'D': {}}}}2
{'A': {'B': {}, 'C': {'D': {}}}}3
{'A': {'B': {}, 'C': {'D': {}}}}0____11
{'A': {'B': {}, 'C': {'D': {}}}}2
{'A': {'B': {}, 'C': {'D': {}}}}3
{'A': {'B': {}, 'C': {'D': {}}}}4
{'A': {'B': {}, 'C': {'D': {}}}}5
{'A': {'B': {}, 'C': {'D': {}}}}2
{'A': {'B': {}, 'C': {'D': {}}}}7
{'A': {'B': {}, 'C': {'D': {}}}}8
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}0
{'A': {'B': {}, 'C': {'D': {}}}}1
{'A': {'B': {}, 'C': {'D': {}}}}2
{'A': {'B': {}, 'C': {'D': {}}}}8
{'A': {'B': {}, 'C': {'D': {}}}}4
{'A': {'B': {}, 'C': {'D': {}}}}3
{'A': {'B': {}, 'C': {'D': {}}}}1
{'A': {'B': {}, 'C': {'D': {}}}}2
{'A': {'B': {}, 'C': {'D': {}}}}7
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}71
{'A': {'B': {}, 'C': {'D': {}}}}72
{'A': {'B': {}, 'C': {'D': {}}}}73
{'A': {'B': {}, 'C': {'D': {}}}}74
{'A': {'B': {}, 'C': {'D': {}}}}75
{'A': {'B': {}, 'C': {'D': {}}}}76
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}78
{'A': {'B': {}, 'C': {'D': {}}}}9
{'A': {'B': {}, 'C': {'D': {}}}}80
{'A': {'B': {}, 'C': {'D': {}}}}81
{'A': {'B': {}, 'C': {'D': {}}}}7
{'A': {'B': {}, 'C': {'D': {}}}}4
{'A': {'B': {}, 'C': {'D': {}}}}5
{'A': {'B': {}, 'C': {'D': {}}}}75
{'A': {'B': {}, 'C': {'D': {}}}}8
{'A': {'B': {}, 'C': {'D': {}}}}4
{'A': {'B': {}, 'C': {'D': {}}}}7
{'A': {'B': {}, 'C': {'D': {}}}}89
{'A': {'B': {}, 'C': {'D': {}}}}2____391
{'A': {'B': {}, 'C': {'D': {}}}}3
{'A': {'B': {}, 'C': {'D': {}}}}1
{'A': {'B': {}, 'C': {'D': {}}}}94
{'A': {'B': {}, 'C': {'D': {}}}}95
{'A': {'B': {}, 'C': {'D': {}}}}4
{'A': {'B': {}, 'C': {'D': {}}}}97
{'A': {'B': {}, 'C': {'D': {}}}}98
{'A': {'B': {}, 'C': {'D': {}}}}99
{'A': {'B': {}, 'C': {'D': {}}}}00
{'A': {'B': {}, 'C': {'D': {}}}}01
{'A': {'B': {}, 'C': {'D': {}}}}98
{'A': {'B': {}, 'C': {'D': {}}}}99
{'A': {'B': {}, 'C': {'D': {}}}}04
{'A': {'B': {}, 'C': {'D': {}}}}01
{'A': {'B': {}, 'C': {'D': {}}}}98
{'A': {'B': {}, 'C': {'D': {}}}}99
{'A': {'B': {}, 'C': {'D': {}}}}08
{'A': {'B': {}, 'C': {'D': {}}}}01
{'A': {'B': {}, 'C': {'D': {}}}}04
{'A': {'B': {}, 'C': {'D': {}}}}01
{'A': {'B': {}, 'C': {'D': {}}}}98
{'A': {'B': {}, 'C': {'D': {}}}}13
Trong một cây được đại diện bởi một danh sách các danh sách, chúng ta sẽ bắt đầu với cấu trúc dữ liệu danh sách của Python và viết các hàm được định nghĩa ở trên. Mặc dù việc viết giao diện dưới dạng một tập hợp các thao tác trong danh sách hơi khác so với các kiểu dữ liệu trừu tượng khác mà chúng tôi đã triển khai, nhưng thật thú vị khi làm như vậy vì nó cung cấp cho chúng tôi cấu trúc dữ liệu đệ quy đơn giản mà chúng tôi có thể xem và kiểm tra trực tiếp. Trong một danh sách dạng cây danh sách, chúng ta sẽ lưu trữ giá trị của nút gốc là phần tử đầu tiên của danh sách. Phần tử thứ hai của danh sách sẽ tự nó là một danh sách đại diện cho cây con bên trái. Phần tử thứ ba của danh sách sẽ là một danh sách khác đại diện cho cây con bên phải. Để minh họa kỹ thuật lưu trữ này, hãy xem một ví dụ. hiển thị một cây đơn giản và triển khai danh sách tương ứng
Hình 1. một cây nhỏ
{'A': {'B': {}, 'C': {'D': {}}}}8
Lưu ý rằng chúng ta có thể truy cập các cây con của danh sách bằng cách lập chỉ mục danh sách tiêu chuẩn. Gốc của cây là
{'A': {'B': {}, 'C': {'D': {}}}}1, cây con bên trái của gốc là
{'A': {'B': {}, 'C': {'D': {}}}}2 và cây con bên phải là
{'A': {'B': {}, 'C': {'D': {}}}}3. minh họa việc tạo một cây đơn giản bằng danh sách. Sau khi cây được xây dựng, chúng ta có thể truy cập vào gốc và các cây con bên trái và bên phải. Một thuộc tính rất hay của cách tiếp cận danh sách các danh sách này là cấu trúc của một danh sách đại diện cho một cây con tuân theo cấu trúc được xác định cho một cây; . Một cây con có một giá trị gốc và hai danh sách trống là một nút lá. Một tính năng hay khác của cách tiếp cận danh sách các danh sách là nó tổng quát hóa cho một cây có nhiều cây con. Trong trường hợp cây nhiều hơn cây nhị phân, cây con khác chỉ là một danh sách khác
Hãy chính thức hóa định nghĩa này về cấu trúc dữ liệu dạng cây bằng cách cung cấp một số hàm giúp chúng ta dễ dàng sử dụng danh sách dưới dạng cây. Lưu ý rằng chúng ta sẽ không định nghĩa một lớp cây nhị phân. Các hàm chúng ta sẽ viết sẽ chỉ giúp chúng ta thao tác với một danh sách chuẩn như thể chúng ta đang làm việc với một cái cây
{'A': {'B': {}, 'C': {'D': {}}}}9
Hàm
{'A': {'B': {}, 'C': {'D': {}}}}4 chỉ đơn giản là tạo một danh sách với một nút gốc và hai danh sách con trống cho các phần tử con. Để thêm một cây con bên trái vào gốc của cây, chúng ta cần chèn một danh sách mới vào vị trí thứ hai của danh sách gốc. Chúng ta phải cẩn thận. Nếu danh sách đã có thứ gì đó ở vị trí thứ hai, chúng ta cần theo dõi nó và đẩy nó xuống dưới dạng cây con bên trái của danh sách mà chúng ta đang thêm. hiển thị mã Python để chèn con bên trái
Liệt kê 1
{'A': {'B': {}, 'C': {'D': {}}}}0
Lưu ý rằng để chèn một phần tử con bên trái, trước tiên chúng ta lấy danh sách [có thể trống] tương ứng với phần tử con bên trái hiện tại. Sau đó, chúng tôi thêm phần tử con bên trái mới, cài đặt phần tử con bên trái cũ làm phần tử con bên trái của phần tử mới. Điều này cho phép chúng ta ghép một nút mới vào cây ở bất kỳ vị trí nào. Mã cho
{'A': {'B': {}, 'C': {'D': {}}}}90 tương tự như
{'A': {'B': {}, 'C': {'D': {}}}}91 và được hiển thị trong
Liệt kê 2
{'A': {'B': {}, 'C': {'D': {}}}}3
Để hoàn thiện tập hợp các hàm tạo cây này [xem ], hãy viết một vài hàm truy cập để lấy và đặt giá trị gốc, cũng như lấy các cây con bên trái hoặc bên phải
Liệt kê 3
{'A': {'B': {}, 'C': {'D': {}}}}4
thực hành các chức năng cây chúng ta vừa viết. Bạn nên thử nó cho chính mình. Một trong những bài tập yêu cầu bạn vẽ cấu trúc cây từ tập hợp các cuộc gọi này
Tự kiểm tra
Q-3. Cho các tuyên bố sau
{'A': {'B': {}, 'C': {'D': {}}}}5
Câu trả lời nào là đại diện chính xác của cây?
Viết một hàm
{'A': {'B': {}, 'C': {'D': {}}}}92 trả về một cây bằng cách sử dụng danh sách các hàm danh sách giống như thế này