You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉树左视图Python实现错误排查求助

二叉树左视图递归实现错误排查

给定二叉树结构:

1
   / \
  2   3
 / \  / \
4   5 6  7
       \
        8

预期左视图为 1, 2, 4,但代码输出结果为 1, 2, 4, 8,错误包含了右子树的节点8。以下是原实现代码:

# left view method
class Node:
    def __init__(self, val):
        self.left = None
        self.right = None
        self.data = val

class Leftview:
    def view(self, root):
        out = []
        maxlevel = [-1]
        self._helperrecur(root, 0, maxlevel, out)
        for i in range(len(out)):
            print(out[i], end=' ')
        

    def _helperrecur(self, root, level, maxlevel, out):

        #base condition
        if root is None:
            return
        
        #main condition
        if level > maxlevel[0]:
            out.append(root.data)
            maxlevel[0] = level

        #recursive through tree
        self._helperrecur(root.left, level+1, maxlevel, out)
        self._helperrecur(root.right, level+1, maxlevel, out)


root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.right.left.right = Node(8)

lf = Leftview()
lf.view(root)

错误原因分析

原代码的核心逻辑是只要当前节点的层级大于已记录的最大层级,就将其加入左视图,但这个逻辑存在漏洞:
当左子树的某一层没有任何节点时,右子树中对应层级的节点会被误判为该层的第一个节点。比如节点8处于第3层,此时左子树的第3层(节点4的左右子节点)为空,遍历到节点8时,它的层级3大于当前maxlevel的2,因此被错误加入左视图,但实际上该层没有左节点,左视图不应包含这个节点。

左视图的定义是每一层的最左侧节点,原逻辑没有保证只有左子树的节点优先被记录,而是只要层级更深就记录,导致右子树的深层节点“钻空子”被加入。

修正方案

修改递归中的判断条件,利用out数组的长度来判断是否为当前层级的第一个节点(因为优先遍历左子树,所以第一个到达该层级的节点必然是最左侧的),同时可以移除冗余的maxlevel变量。

修正后的完整代码:

# left view method
class Node:
    def __init__(self, val):
        self.left = None
        self.right = None
        self.data = val

class Leftview:
    def view(self, root):
        out = []
        self._helperrecur(root, 0, out)
        for i in range(len(out)):
            print(out[i], end=' ')
        

    def _helperrecur(self, root, level, out):
        if root is None:
            return
        
        # 只有当当前层级等于已收集的节点数时,才加入(说明是该层第一个节点)
        if level == len(out):
            out.append(root.data)

        # 优先遍历左子树,保证左节点先被处理
        self._helperrecur(root.left, level+1, out)
        self._helperrecur(root.right, level+1, out)


root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.right.left.right = Node(8)

lf = Leftview()
lf.view(root)

修正逻辑说明

  • out数组的长度等于已经收集的左视图节点数,对应已处理完成的层级数(从0开始计数)。例如out有3个元素时,说明已经处理了0、1、2层,只有当节点层级为3且是第一个到达该层级的节点时,才会被加入。
  • 始终优先遍历左子树,确保同一层级中左节点先被访问,这样第一个触发level == len(out)的节点必然是该层最左侧的节点,不会让右子树的节点误加入。

内容的提问来源于stack exchange,提问作者Sagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:37:35