如何解决调试:二叉树的右视图
给出一个二叉树,找到它的右视图。二叉树的右视图是从右侧查看该树时可见的一组节点。
以下树的右视图:
1 3 7 8
1
/ \
2 3
/ \ / \
4 5 6 7
\
8
示例1:
输入:
1
/ \
3 2
输出:
1 2
示例2:
输入:
10
/ \
20 30
/ \
40 60
输出:
10 30 60
任务: 只需完成将node作为参数并返回右视图作为列表的rightView()函数即可。
我的代码:
'''
# Node Class:
class Node:
def init(self,val):
self.data = val
self.left = None
self.right = None
'''
def func(list1,root,level,max_level):
if not root:
return
if max_level<level:
list1.append(root.data)
max_level=level
func(list1,root.right,level+1,max_level)
func(list1,root.left,max_level)
def rightView(root):
max_level = 0
list1 = []
func(list1,1,max_level)
return list1
如果我将max_level = 0
更改为max_level=[0]
并
所有其他max_level行,例如max_level<level
至max_level[0]<level
和max_level=level
至max_level[0]=level
。
如果做出这些更改,我会得到正确的答案。
为什么会这样?
解决方法
当您使用 max_level = 0 时,此变量不会通过引用传递给函数,因此不会针对使用该函数的每个函数调用进行更新。
func(list1,root.right,level+1,max_level)
func(list1,root.left,max_level)
假设您在第一个函数调用中更新了max_level,尽管它与先前为第二个函数调用设置的相同。
max_level = [0] 时,此列表已 通过引用传递 ,因此,当您对其进行更新时。这些更改对于使用它的所有函数调用都是有效的。
,假设您正在从右侧查看树,您只会看到每个级别的最后一个节点。我们所要做的只是进行一次层序遍历并找到最后一个节点并将其附加到结果列表中。
为了解决这个问题,初始化两个列表:一个用于结果,一个用于每个级别的节点。
我定义了 queue
列表来存储每个级别的节点。如果您在一个级别中有 3 个节点,则意味着您将从该级别推送 3 个节点。这也意味着您将检查每个节点是否有左节点或右节点 3 次,因为您只有 3 个节点。因此,您将倒计时 3 次,在第二个 while 循环中,当您完成检查此级别的所有 3 个项目时,您调用的最后一个将存储为 currentNode
,在第二个 while 循环之后,您将推动结果列表的最后一个节点。
def rightSideView(root):
if not root:
return []
result=[]
queue=[root]
while len(queue):
count=0
length=len(queue)
while count<length:
current_node=queue.pop(0)
if current_node.left:
queue.append(current_node.left)
if current_node.right:
queue.append(current_node.right)
count+=1
result.append(currentNode)
return result
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。