作者VivianAnn (薇薇安安)
看板Python
标题[问题] Leetcode 1660,tree的问题
时间Wed Aug 18 11:33:17 2021
各位版友好,在刷leetcode 1660时碰到了一个问题,但不知错误在哪。
我的想法是使用BFS,逐个level找题目所要的invalid node,找到的话就将invalid node
的本身,以及其左右子树设为None。
以下是我的code:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def correctBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
queue = collections.deque([root])
while queue:
visited = set()
for _ in range(len(queue)):
curr = queue.popleft()
visited.add(curr)
if curr.right in visited:
curr.left = None
curr.right = None
curr = None
continue
if curr.right:
queue.append(curr.right)
if curr.left:
queue.append(curr.left)
return root
但是,对於这个test case:
[1,2,3]
2
3
我所return的还是原本的树:[1,2,3],显然invalid node没有被设为None。请问是为什
麽呢? 我先谢谢各位愿意看完我的问题,有不清楚的地方我会再补充!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.170.26.70 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1629257599.A.4EB.html
1F:→ aassdd926: 你的queue先塞的是3再来是2吧,所以找不到 08/18 11:44
2F:推 aassdd926: 喔我看错了 先塞右子树是对的 08/18 11:52
3F:推 aassdd926: 因为我不是用python刷,所以不太确定,但看起来有两种 08/18 12:00
4F:→ aassdd926: 可能,一是set 没找到,二是curr = None这行没改到, 08/18 12:00
5F:→ aassdd926: 可以检查看看 08/18 12:00
6F:→ VivianAnn: 我看Discuss里的解法都是去纪录每个节点的父节点 08/18 12:24
7F:→ VivianAnn: 找到invalid node後再由invalid node的父节点去改 08/18 12:24
8F:→ VivianAnn: 那个方法我懂,但我想知道这个方法为什麽行不通 08/18 12:25
9F:→ VivianAnn: curr = None 这行,我测试是有改到.... 08/18 12:26
10F:推 aassdd926: 我刚刚检查了id ,发现curr=None 让curr 这个变数refe 08/18 16:21
11F:→ aassdd926: r to None value, which is a new space 08/18 16:21
12F:→ VivianAnn: 不懂耶,把curr的ref设为null不是我们想要的吗? 08/18 21:40
13F:→ aassdd926: 是新设一个存 None的空间,然後curr 这个指针指过去, 08/18 23:22
14F:→ aassdd926: 所以原本的 node(2)还留着 08/18 23:22
15F:→ aassdd926: 所以你是改指针指去的位置,而不是指针原本指的空间的 08/18 23:27
16F:→ aassdd926: 值 08/18 23:27
17F:→ VivianAnn: 谢谢,我懂了,这样的话只能由父节点去改了 08/19 23:40