在下面的代码中,树有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
答案 0 :(得分:2)
这只是recursion。
而不是在' B'之后发生的事情。如果打印出来,你应该考虑在B' B'之前发生的事情。打印出来。
让我们在包含' B'的节点之前考虑根t2
。(也许您甚至可以将树减少为仅包含t2,t4和t5。这应该更有启发性)。接下来会发生以下情况:
之后,我们转移到t2等的父母。
请注意,对于没有子项的树,将打印根,因为其子root is None
的计算结果为false。因此,在孩子一级没有任何事情发生,我们遍历到根,打印它的名字,并且在它没有再发生任何事情的情况下传到它的孩子身上。
关于您的评论:您的代码可确保您在打印“D' D'你也会打印' B'之后由于递归!
假设我们只有树(t2,(t4,t5)),我们称之为inorderTraversal(t2)
:
发生了什么(删除不必要的res后):
从t2开始
if t2: (True)
inorderTraversal(t4)
print 'B'
inorderTraversal(t5)
执行inorderTraversal(t4)并解析if(t2)
if t4 (True):
inorderTraversal(None)
print 'D'
inorderTraversal(None)
print 'B'
inorderTraversal(t5)
让我们看看大括号中的术语是做什么的: inorderTraversal(无)只是注意到,所以这里发生的唯一事情是打印t4的名称。 所以你看,印刷品' B'比打印更早出现'
让我们再次总结递归调用
print 'D'
print 'B'
inorderTraversal(t5)