亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在二叉搜索樹中產生數據成員

在二叉搜索樹中產生數據成員

桃花長相依 2021-11-23 16:48:11
我正在嘗試為我的二叉搜索樹實現迭代器。為了實現這一點,我試圖通過樹進行有序遍歷并產生每個單獨的數據成員。這將允許我遍歷樹的每個項目。我的功能:def __iter__(self):    """    in-order traversal of a binary search tree    """    if self.root is not None:        self.check(self.root)def check(self, cur_node):    if cur_node is not None:        self.check(cur_node.left)        yield cur_node.data #if I were to print this data member, it would be fine        self.check(cur_node.right)使用迭代測試此函數時,例如for i in tree:我收到此錯誤:TypeError: iter() returned non-iterator of type 'NoneType'
查看完整描述

3 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

要實現遞歸生成器,您不能只是“調用”自己,您需要提取元素并生成它們。


Python對此有一個特殊的語法:


 yield from expr

whereexpr是可迭代的,它可以看作是


 for x in expr:

     yield x

使用它,您可以使用以下內容實現樹的有序遍歷:


class Node:

    def __init__(self, data, left, right):

        self.data = data

        self.left = left

        self.right = right


    def __iter__(self):

        if self.left:

            yield from self.left

        yield self.data

        if self.right:

            yield from self.right


查看完整回答
反對 回復 2021-11-23
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

您通常希望迭代器作為獨立于數據結構的實體,因此您可以在數據上使用多個迭代器,因此您可以多次迭代您的數據。下面,我將展示如何為基本 BST 類實現簡單的 DFS 算法。


class Node:

    def __init__(self, val, left=None, right=None):

        self.val = val

        self.left = left

        self.right = right

    def __iter__(self):

        return BSTIterator(self)


class BSTIterator:

    def __init__(self, root):

        self.stack = []

        curr = root

        while curr:

            self.stack.append(curr)

            curr = curr.left

    def __next__(self):

        if not self.stack:

            raise StopIteration()

        node = self.stack.pop()

        val = node.val

        node = node.right

        while node:

            self.stack.append(node)

            node = node.left

        return val

    def __iter__(self):

        return self


root = Node(5, Node(3, Node(1), Node(4)), Node(10, (Node(6, None, Node(7)))))

list(root)

# [1, 3, 4, 5, 6, 7, 10]


查看完整回答
反對 回復 2021-11-23
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

線索是


iter() 返回 ....


所以你需要返回一個迭代器。你的類是一個迭代器,所以返回 self


def __iter__(self):

    """

    in-order traversal of a binary search tree

    """

    if self.root is not None:

        self.check(self.root)

    return self

您可能__next__也應該實施以實際產生價值。


所以解決方案可能看起來像


class Tree:

    def __init__(...): ...


    def __iter__(self):

        return self


    def __next__(self):

        if self.left is not None:

            yield from self.left

        yield self.data

        if self.right is not None:    

            yield from self.right 

您yield from在此處使用委托給子節點。請參閱https://docs.python.org/3/whatsnew/3.3.html#pep-380-syntax-for-delegating-to-a-subgenerator


實際上,您確實需要三個 yield 語句,因為您需要遍歷左右子節點,以及生成當前節點的值。


查看完整回答
反對 回復 2021-11-23
  • 3 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號