Thay vì gọi self.left/right.
in
_order_list()
, bạn đang gọi điện thoại self.left/right.
pre
_order_list()
.
Để thực hiện những gì bạn muốn làm một chức năng phát có thể tốt hơn (ít bộ nhớ tốn và pythonic hơn) để tích lũy các giá trị trong một danh sách:
class Tree(object):
...
def in_order(self):
if self.left is not None:
for value in self.left.in_order():
yield value
yield self.value # <-- yielding the value of the node, not the node itself
if self.right is not None:
for value in self.right.in_order():
yield value
...
tree = Tree(...)
in_order_values = list(tree.in_order())
Bằng cách đó, bạn don' t có để tạo ra một danh sách nếu bạn chỉ muốn để lặp qua các giá trị:
for value in tree.in_order():
...
thuật toán các công trình như thế này: máy phát điện đầu tiên xuống đệ quy dọc theo nhánh bên trái của mỗi nút cho đến khi nó chạm một với không phụ trái nút. Sau đó, nó mang lại giá trị của nút hiện tại. Sau đó nó thực hiện tương tự trên nút con bên phải, nhưng bắt đầu từ nút hiện tại, không phải nút gốc. Nếu chúng ta giả sử không có chu kỳ trong cây và không có nhánh vô hạn, thì chắc chắn sẽ có các nút lá, tức là các nút không có nút con trái hoặc phải. Các nút IOW, mà cả hai trường hợp cơ bản (self.left/right is None
) đều đạt được. Vì vậy, các cuộc gọi đệ quy sẽ trở lại, hy vọng trước khi chúng tôi hết bộ nhớ hoặc đạt đến giới hạn ngăn xếp.
Vòng lặp trên self.left/right.in_order()
là cần thiết do thực tế rằng những gì các cuộc gọi đến in_order()
lợi nhuận là một vì thế tên máy phát chức năng máy phát điện,. Máy phát trả lại phải cạn kiệt bằng cách nào đó, ví dụ: thông qua một vòng lặp.Trong phần thân của vòng lặp, chúng tôi thu lại các giá trị lên một cấp, trong đó chúng được tạo lại một lần nữa, cho đến khi chúng đạt đến cấp cao nhất. Ở đó chúng tôi sử dụng các giá trị.
Nếu bạn muốn lấy các nút themself thay vì chỉ trường giá trị của họ, bạn có thể làm điều đó như thế này:
class Tree(object):
...
def in_order(self):
if self.left is not None:
for node in self.left.in_order():
yield node
yield self # <-- yielding the node itself
if self.right is not None:
for node in self.right.in_order():
yield node
Bạn có thể muốn làm điều này, bởi vì không chỉ bạn vẫn có thể truy cập vào các giá trị của các nút:
for node in tree.in_order():
do_something_with(node.value)
nhưng cũng có thể bạn có thể làm bất cứ điều gì bạn muốn với các nút:
for node in tree.in_order():
whatever(node.some_other_attribute)
ở đâu trước Cấu trúc dữ liệu của biểu đồ –