Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 二叉词树_Tree_Iterator_Binary Tree - Fatal编程技术网

Tree 二叉词树

Tree 二叉词树,tree,iterator,binary-tree,Tree,Iterator,Binary Tree,我上一节cs课勉强及格,现在我在数据结构方面。我正在从头开始构建一个二叉树结构,对于迭代器将如何工作,我有点困惑。我理解它们是如何在双链接列表中工作的,但不确定这个列表将如何工作。你所说的“迭代器”是什么意思?如果只需迭代树,则可以递归执行: 如果您必须在C#或Java中提供IEnumerator接口,或者希望节省堆栈空间,请使用以下方法: 您可以在C#中使用yield,或者轻松地将while循环转换为迭代器所需的“GetNext”方法。什么是“迭代器”?如果只需迭代树,则可以递归执行: 如

我上一节cs课勉强及格,现在我在数据结构方面。我正在从头开始构建一个二叉树结构,对于迭代器将如何工作,我有点困惑。我理解它们是如何在双链接列表中工作的,但不确定这个列表将如何工作。

你所说的“迭代器”是什么意思?如果只需迭代树,则可以递归执行:

如果您必须在C#或Java中提供IEnumerator接口,或者希望节省堆栈空间,请使用以下方法: 您可以在C#中使用yield,或者轻松地将while循环转换为迭代器所需的“GetNext”方法。

什么是“迭代器”?如果只需迭代树,则可以递归执行:

如果您必须在C#或Java中提供IEnumerator接口,或者希望节省堆栈空间,请使用以下方法:
您可以在C#中使用yield,也可以轻松地将while循环转换为迭代器所需的“GetNext”方法。

我可以递归地这样做。我只是想在脑海里想象你是如何从一片叶子移动到另一片叶子的,因为从根部开始,有两种选择下一步要去哪里,然后它只会增加2^n倍。这种工作顺序让我很困惑。

我可以递归地做。我只是想在脑海里想象你是如何从一片叶子移动到另一片叶子的,因为从根部开始,有两种选择下一步要去哪里,然后它只会增加2^n倍。这种工作方式的顺序让我感到困惑。

遍历树有两种主要方式。我在上发布了一些Python代码示例,介绍了如何执行此操作。

遍历树的主要方法有两种。我在上发布了一些Python代码示例。在二叉树中,每个节点都会存储一些值,并有两个子节点,例如left和right。现在遍历树的一种方法是从顶部开始,遍历左子节点,查看该节点的值,然后遍历右子节点

其中遍历子对象表示(递归): 1) 左遍历子对象 2) 查看节点的值 3) 遍历右子对象

这是一种深度优先遍历,因此对于每个节点,您首先“使用”或“查看”其左子节点的值,然后是当前节点的值,最后是右子节点的值

对于宽度优先遍历,您将从根开始,查看节点的值,然后将其子节点(如果存在)推送到队列中。然后在队列中有节点时循环,从队列前面获取节点并重复:查看它的值,如果它有子节点,则将它们推到队列的末尾

python中的示例:

#!/usr/bin/env python

    class Node:
        def __init__(self, val = 0):
            self.value = val
            self.left = None
            self.right = None

        def __str__(self):
            return "%d" % (self.value)

    def dfs(node = None):
        if node is None: return

        dfs(node.left)
        print node
        dfs(node.right)

    def bfs(root = None):
        if root is None: return

        nodes = []
        nodes.append(root)

        while len(nodes):
            current = nodes[0]
            print current
            nodes.remove(current)

        if current.left is not None:
            nodes.append(current.left)
        if current.right is not None:
            nodes.append(current.right)

    def main():
        root = Node(0)
        root.left = Node(10)
        root.right = Node(20)

        l = root.left
        l.left = Node(100)
        l.right = Node(101)

        r = root.right
        r.left = Node(200)
        r.right = Node(201)

        dfs(root)
        bfs(root)


    if __name__ == '__main__':
        main()



# example tree constructed:
#            0
#      10        20
#  100   101  200  201

# dfs (depth first) traversal:
# 100
# 10
# 101
# 0
# 200
# 20
# 201

# bfs (breadth first) traversal:
# 0
# 10
# 20
# 100
# 101
# 200
# 201

在二叉树中,每个节点都会存储一些值,并有两个子节点,例如左和右。现在遍历树的一种方法是从顶部开始,遍历左子节点,查看该节点的值,然后遍历右子节点

其中遍历子对象表示(递归): 1) 左遍历子对象 2) 查看节点的值 3) 遍历右子对象

这是一种深度优先遍历,因此对于每个节点,您首先“使用”或“查看”其左子节点的值,然后是当前节点的值,最后是右子节点的值

对于宽度优先遍历,您将从根开始,查看节点的值,然后将其子节点(如果存在)推送到队列中。然后在队列中有节点时循环,从队列前面获取节点并重复:查看它的值,如果它有子节点,则将它们推到队列的末尾

python中的示例:

#!/usr/bin/env python

    class Node:
        def __init__(self, val = 0):
            self.value = val
            self.left = None
            self.right = None

        def __str__(self):
            return "%d" % (self.value)

    def dfs(node = None):
        if node is None: return

        dfs(node.left)
        print node
        dfs(node.right)

    def bfs(root = None):
        if root is None: return

        nodes = []
        nodes.append(root)

        while len(nodes):
            current = nodes[0]
            print current
            nodes.remove(current)

        if current.left is not None:
            nodes.append(current.left)
        if current.right is not None:
            nodes.append(current.right)

    def main():
        root = Node(0)
        root.left = Node(10)
        root.right = Node(20)

        l = root.left
        l.left = Node(100)
        l.right = Node(101)

        r = root.right
        r.left = Node(200)
        r.right = Node(201)

        dfs(root)
        bfs(root)


    if __name__ == '__main__':
        main()



# example tree constructed:
#            0
#      10        20
#  100   101  200  201

# dfs (depth first) traversal:
# 100
# 10
# 101
# 0
# 200
# 20
# 201

# bfs (breadth first) traversal:
# 0
# 10
# 20
# 100
# 101
# 200
# 201

我在数据结构课上也遇到了同样的问题

我的解决方案相当简单

递归遍历树,但将访问的每个节点存储在另一个集合中,然后迭代该新集合。这样,编写迭代器一点也不麻烦


我个人选择使用堆栈,但您可以使用一个简单的数组,甚至是一个链接列表(您说您已经有过使用该列表的经验)。

我在数据结构类中也遇到过同样的问题

我的解决方案相当简单

递归遍历树,但将访问的每个节点存储在另一个集合中,然后迭代该新集合。这样,编写迭代器一点也不麻烦


我个人选择使用堆栈,但你可以使用简单的数组,甚至是链表(你说你已经有使用经验)。

所有其他答案都是关于如何在树结构上实现迭代器的技术讨论。然而,正如我理解您的问题一样,您似乎在理解树遍历概念的机制,而不仅仅是实现方面遇到了困难。换句话说,您不需要“摸索”树遍历。最有帮助的可能是获得一个好的伪代码算法,用于遍历二叉树、铅笔、一张纸,并给出一个示例。构建一个简单的二叉树,然后自己按照伪代码机械地遍历它。你可能应该用第二张纸来写这篇文章。也就是说,每个函数处于被调用的中间状态,因为它在等待一个子函数返回。 在进行此操作时,请记住,树是一种非常优雅的结构。它看起来很复杂,但在每个节点上都很简单。要对树中的所有元素执行操作,只需在树的根上执行该操作,然后让该操作对该根的每个子级调用自己,这些子级本身就是子树的根。自己做一个例子将大大有助于让你的头脑理解和接受递归。如果你觉得很难,不要感到困惑。递归很奇怪。起初这是一个很难理解的概念,但理解和使用树木是必要的

下面是一个示例(ASCII art)树,您可以使用它来启动:

F / \ / \ D H / \ / \ B E G I / \ A C F / \ / \ D H / \ / \ B E G I / \ A C 和一个简单的pseu