当尝试做广度优先解决方案时,我遇到了意想不到的行为。 在函数levelOrder中,如果首先处理左节点,则它给出正确的结果3 2 5 1 4 7,如果在左节点之前保留右节点,则输出为3 5 2 7 4 1.
我不知道造成这种行为的原因。 这个问题已在hackerrank
上提出给定输入
3
/ \
2 5
/ \ \
1 4 7
我的代码
import sys
class Node:
def __init__(self,data):
self.right=self.left=None
self.data = data
class Solution:
def insert(self,root,data):
if root==None:
return Node(data)
else:
if data<=root.data:
cur=self.insert(root.left,data)
root.left=cur
else:
cur=self.insert(root.right,data)
root.right=cur
return root
def levelOrder(self,root):
#Write your code here
lisT = []
i = 0
lisT.append(root)
while i < len(lisT):
if root.left:
lisT.append(root.left)
if root.right:
lisT.append(root.right)
i += 1
#print('i=',i,' len(lisT)=',len(lisT))
try:
root = lisT[i]
except Exception as e:
i = len(lisT)
for each in lisT:
print(each.data, end=' ')
T=int(input())
myTree=Solution()
root=None
for i in range(T):
data=int(input())
root=myTree.insert(root,data)
myTree.levelOrder(root)
答案 0 :(得分:0)
你已经给出了解释。如果你从右到左,你会得到相反的每个级别。 2 5 - &gt; 5 2和1 4 7 - &gt; 7 4 1。
对于解决方案,您还应该考虑一个队列。使用先进先出,您可以在每个级别中附加左右分支(如果不是None),然后使用列表的第一个元素打印出下一个级别。当队列为空时,你就完成了。
作为补充,您应该避免except Exception
并更加具体地了解异常,在本例中为IndexError
。这是防止你不想处理的异常处理的一般编码风格(如KeyboardInterrupt)。