二叉树LCA代码报错:AttributeError: 'list'对象无'left'属性
问题原因
你调用lowestCommonAncestor时犯了两个关键错误:
- 第一个参数传了列表,但方法要求的是
TreeNode类型的根节点,列表没有left/right属性,直接触发AttributeError。 - 后面的
p和q传的是数值(5、1),但方法里是比较TreeNode对象是否相等,不是比较节点值,即使树构建正确,这样传参也找不到目标节点。
解决步骤
1. 实现列表转二叉树的辅助函数
用广度优先遍历(BFS)把输入的列表转换成TreeNode结构,处理None代表空节点的情况:
def list_to_tree(arr): if not arr: return None root = TreeNode(arr[0]) queue = [root] idx = 1 while queue and idx < len(arr): node = queue.pop(0) # 处理左子节点 if arr[idx] is not None: node.left = TreeNode(arr[idx]) queue.append(node.left) idx += 1 if idx >= len(arr): break # 处理右子节点 if arr[idx] is not None: node.right = TreeNode(arr[idx]) queue.append(node.right) idx += 1 return root
2. 找到目标节点的辅助函数
因为方法需要传入TreeNode对象,所以要从构建好的树中找到对应值的节点:
def find_node(root, val): if not root: return None if root.val == val: return root left = find_node(root.left, val) if left: return left return find_node(root.right, val)
3. 正确调用LCA方法
把列表转成树,找到目标节点后再调用:
# 原TreeNode和Solution类保留不变 class TreeNode: def __init__ (self, x): self.val = x self.right = None self.left = None class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if not root: return None elif root == p or root == q: return root l = self.lowestCommonAncestor(root.left, p, q) r = self.lowestCommonAncestor(root.right, p, q) if l and r: return root else: return l or r # 正确调用流程 s = Solution() # 1. 列表转二叉树 tree_root = list_to_tree([3,5,1,6,2,0,8,None,None,7,4]) # 2. 找到目标节点 p_node = find_node(tree_root, 5) q_node = find_node(tree_root, 1) # 3. 调用LCA方法 result = s.lowestCommonAncestor(tree_root, p_node, q_node) print(result.val) # 输出3,符合预期
验证说明
运行上述代码后,会正确输出3,也就是节点5和1的最近公共祖先,解决了原有的错误。
内容的提问来源于stack exchange,提问作者Qagan
相关产品推荐
相关产品推荐

