Tôi đang cố gắng triển khai một lớp trình lặp cho các cây không nhất thiết phải nhị phân trong Python. Sau khi trình vòng lặp được xây dựng bằng nút gốc của cây, chức năng next()
của nó có thể được gọi lặp lại để di chuyển cây theo thứ tự chiều sâu (ví dụ: this order), cuối cùng trở về None
khi không còn nút nào.Thực hiện trình lặp cây có độ sâu đầu tiên bằng Python
Đây là Node
lớp cơ bản cho một cây:
class Node(object):
def __init__(self, title, children=None):
self.title = title
self.children = children or []
self.visited = False
def __str__(self):
return self.title
Như bạn thấy ở trên, tôi đã giới thiệu một tài sản visited
đến các hạch cho cách tiếp cận đầu tiên của tôi, vì tôi đã không nhìn thấy một con đường xung quanh nó . Với biện pháp bổ sung của nhà nước, lớp Iterator
trông như thế này:
class Iterator(object):
def __init__(self, root):
self.stack = []
self.current = root
def next(self):
if self.current is None:
return None
self.stack.append(self.current)
self.current.visited = True
# Root case
if len(self.stack) == 1:
return self.current
while self.stack:
self.current = self.stack[-1]
for child in self.current.children:
if not child.visited:
self.current = child
return child
self.stack.pop()
này là tất cả tốt và tốt, nhưng tôi muốn để thoát khỏi sự cần thiết của các visited
bất động sản, mà không cần đến đệ quy hoặc mọi thay đổi khác đến lớp Node
.
Tất cả trạng thái tôi cần phải được xử lý trong trình lặp, nhưng tôi không biết cách thực hiện điều đó. Giữ một danh sách truy cập cho toàn bộ cây là không thể mở rộng và ra khỏi câu hỏi, vì vậy phải có một cách thông minh để sử dụng ngăn xếp.
Điều đặc biệt làm tôi bối rối là - vì chức năng next()
, tất nhiên, trả về, làm cách nào tôi có thể nhớ nơi mình đã ở mà không đánh dấu gì hoặc sử dụng bộ nhớ dư thừa? Trực giác, tôi nghĩ về việc lặp lại trẻ em, nhưng logic đó bị hỏng/lãng quên khi hàm next()
trả về!
CẬP NHẬT - Đây là một thử nghiệm nhỏ:
tree = Node(
'A', [
Node('B', [
Node('C', [
Node('D')
]),
Node('E'),
]),
Node('F'),
Node('G'),
])
iter = Iterator(tree)
out = object()
while out:
out = iter.next()
print out
Giữ danh sách * đã truy cập * có thể không thể mở rộng, nhưng về tập hợp đã truy cập, ví dụ: dựa trên ID đối tượng nút? – michaelb
Tuy nhiên, điều đó vẫn có khả năng giữ tất cả các nhãn. Tôi muốn iterator chỉ giữ một tập con của cây tại một thời điểm. – nicole
Đầu ra dự kiến của "thử nghiệm nhỏ" là gì? –