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

时间:2017-03-28 07:56:39

标签: 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

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

1 个答案:

答案 0 :(得分:2)

这只是recursion

而不是在' B'之后发生的事情。如果打印出来,你应该考虑在B' B'之前发生的事情。打印出来。

让我们在包含' B'的节点之前考虑根t2。(也许您甚至可以将树减少为仅包含t2,t4和t5。这应该更有启发性)。接下来会发生以下情况:

  1. inordertraversal to t4,这是t2的左子。最终,这将打印出来' D'
  2. print' B'
  3. inordertraversal to t5,这是t2的正确孩子。最终,这将打印' E'
  4. 之后,我们转移到t2等的父母。

    请注意,对于没有子项的树,将打印根,因为其子root is None的计算结果为false。因此,在孩子一级没有任何事情发生,我们遍历到根,打印它的名字,并且在它没有再发生任何事情的情况下传到它的孩子身上。

    关于您的评论:您的代码可确保您在打印“D' D'你也会打印' B'之后由于递归!

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

    1. 从t2开始

      if t2: (True)
          inorderTraversal(t4)
          print 'B'
          inorderTraversal(t5)
      
    2. 执行inorderTraversal(t4)并解析if(t2)

      if t4 (True):
             inorderTraversal(None)
             print 'D'
             inorderTraversal(None) 
      
      print 'B'
      inorderTraversal(t5)
      
    3. 让我们看看大括号中的术语是做什么的: inorderTraversal(无)只是注意到,所以这里发生的唯一事情是打印t4的名称。 所以你看,印刷品' B'比打印更早出现'

      1. 让我们再次总结递归调用

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