Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
python中的树遍历打印子节点后如何确定父节点_Python_Binary Tree - Fatal编程技术网

python中的树遍历打印子节点后如何确定父节点

python中的树遍历打印子节点后如何确定父节点,python,binary-tree,Python,Binary Tree,在下面的代码中,树有5个元素,其中A有(B,C)和B有(D,E),我的问题是在打印最后一个元素之后,该节点是D。在下面的代码中,节点如何切换到“B”,有人能解释一下这个代码吗 class trees(object): def __init__(self,name,left=None,right=None): self.name = name self.left = None self.right = None de

在下面的代码中,树有5个元素,其中A有(B,C)和B有(D,E),我的问题是在打印最后一个元素之后,该节点是D。在下面的代码中,节点如何切换到“B”,有人能解释一下这个代码吗

class trees(object):
    def __init__(self,name,left=None,right=None):
            self.name = name
            self.left = None
            self.right = None

def inorderTraversal(root):
     res = []
     if root:
            res = inorderTraversal(root.left) 
            print root.name
            res = res + inorderTraversal(root.right)

t1=trees('A')
t2=trees('B')
t3=trees('C')
t4=trees('D')
t5=trees('E')

t1.left = t2
t1.right = t3
t2.left= t4
t2.right = t5

inorderTraversal(t1) 
#prints D,B,E,A,C
这很简单

与其说在打印“B”之后会发生什么,不如说在打印“B”之前会发生什么

让我们考虑在包含“B”的节点之前的根<代码> T2<代码>(也许你甚至可以减少你的树只包含T2、T4和T5。这应该更有启发性)。接下来会发生以下情况:

  • 顺序旅行到t4,t4是t2的左子级。最终,这将打印“D”
  • 打印“B”
  • 以顺序从第一行到第二行的右边子行的第五行。最终,这将打印“E”
  • 之后,我们转到t2的父级,等等

    请注意,对于没有子树的树,将打印根,因为其子树的
    根为None
    的计算结果为false。因此,在子级上不会发生任何事情,我们遍历到根,打印它的名称,然后向下遍历到它的子级,在那里不会再发生任何事情


    关于您的评论:您的代码确保当您打印“D”时,由于递归,您也将在之后打印“B”

    假设我们只有树(t2,(t4,t5)),我们调用
    inorderTraversal(t2)
    : 发生了什么(删除不必要的res后):

  • 从t2开始

    if t2: (True)
        inorderTraversal(t4)
        print 'B'
        inorderTraversal(t5)
    
  • 执行inorderTraversal(t4)并解决if(t2)

  • 让我们看看花括号中的术语在做什么: inorderTraversal(None)只是不做任何事情,所以这里唯一发生的事情就是打印t4的名称。 您可以看到,打印“B”比打印“D”早出现

  • 让我们再次总结一下递归调用

    print 'D' 
    print 'B'
    inorderTraversal(t5)
    
  • 这很简单

    与其说在打印“B”之后会发生什么,不如说在打印“B”之前会发生什么

    让我们考虑在包含“B”的节点之前的根<代码> T2<代码>(也许你甚至可以减少你的树只包含T2、T4和T5。这应该更有启发性)。接下来会发生以下情况:

  • 顺序旅行到t4,t4是t2的左子级。最终,这将打印“D”
  • 打印“B”
  • 以顺序从第一行到第二行的右边子行的第五行。最终,这将打印“E”
  • 之后,我们转到t2的父级,等等

    请注意,对于没有子树的树,将打印根,因为其子树的
    根为None
    的计算结果为false。因此,在子级上不会发生任何事情,我们遍历到根,打印它的名称,然后向下遍历到它的子级,在那里不会再发生任何事情


    关于您的评论:您的代码确保当您打印“D”时,由于递归,您也将在之后打印“B”

    假设我们只有树(t2,(t4,t5)),我们调用
    inorderTraversal(t2)
    : 发生了什么(删除不必要的res后):

  • 从t2开始

    if t2: (True)
        inorderTraversal(t4)
        print 'B'
        inorderTraversal(t5)
    
  • 执行inorderTraversal(t4)并解决if(t2)

  • 让我们看看花括号中的术语在做什么: inorderTraversal(None)只是不做任何事情,所以这里唯一发生的事情就是打印t4的名称。 您可以看到,打印“B”比打印“D”早出现

  • 让我们再次总结一下递归调用

    print 'D' 
    print 'B'
    inorderTraversal(t5)
    

  • 打印“D”后,根现在是t4,但如何打印“B”。例如,在点2中,t2现在何时发生变化?添加了另一个代码示例。但是,您真的熟悉递归吗?这是这里唯一发生的事情,我想这就是递归的工作原理。不再在t2上调用遍历函数,而是仅在其子级上执行命令。所以t2没有看到它的左和右子级是
    None
    ,因为它们不是。顺便说一句,你应该去掉res,因为它完全不起任何作用,而且可能会使事情变得更复杂。注意,我使用了inorderTraversal(None),它什么也不起作用!因此,在第三步中,我们可以打印“D”和“B”,然后我们需要遍历到t4。打印“D”后,根现在是t4,但如何打印“B”。例如,在点2中,t2现在何时发生更改?2添加了另一个代码示例。但是,您真的熟悉递归吗?这是这里唯一发生的事情,我想这就是递归的工作原理。不再在t2上调用遍历函数,而是仅在其子级上执行命令。所以t2没有看到它的左和右子级是
    None
    ,因为它们不是。顺便说一句,你应该去掉res,因为它完全不起任何作用,而且可能会使事情变得更复杂。注意,我使用了inorderTraversal(None),它什么也不起作用!所以在第三步中,我们可以打印“D”和“B”,然后我们需要遍历到t4。