调试:二叉树的右视图

问题描述

给出一个二叉树,找到它的右视图。二叉树的右视图是从右侧查看该树时可见的一组节点。

以下树的右视图:

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<levelmax_level[0]<levelmax_level=levelmax_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