簡體   English   中英

為什么這個二叉樹前序遍歷不返回

[英]Why is this binary tree preorder traversal returning none

嗨,我正在嘗試解決leetcode問題1379

這是問題的陳述+鏈接:

https://leetcode.com/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/

問題

這是我失敗的解決方案嘗試:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def getTargetCopy(self, original: TreeNode, cloned: TreeNode, target: TreeNode) -> TreeNode:
        if cloned:
            if cloned.val == target.val:
                return cloned
            self.getTargetCopy(original, cloned.left, target)
            self.getTargetCopy(original, cloned.right, target)

我不明白為什么這不起作用。

我認為我的解決方案是對樹進行預序遍歷,並在每個階段詢問克隆樹中的節點是否存在,如果存在,它的值是否等於我們正在尋找的值? 如果是,則返回該節點,我們已經找到了我們正在尋找的節點。

如果不是,則檢查簡單地繼續檢查樹。 由於樹中的值保證是唯一的,並且目標值保證在樹中,並且我正在訪問每個節點,因此這肯定可以找到答案。

然而,它沒有通過自動化測試,它甚至沒有通過示例 1(如上圖所示),並表示它正在返回null

我錯過了什么?

編輯:

我嘗試在每個 function 電話中打印帶有爭論的原始解決方案:

__main__.Solution.getTargetCopy ( self = <__main__.Solution object at 0x000002B15CF31358>, original = 7, cloned = 7, target = 3 )
__main__.Solution.getTargetCopy ( self = <__main__.Solution object at 0x000002B15CF31358>, original = 7, cloned = 4, target = 3 )
__main__.Solution.getTargetCopy ( self = <__main__.Solution object at 0x000002B15CF31358>, original = 7, cloned = None, target = 3 )
__main__.Solution.getTargetCopy ( self = <__main__.Solution object at 0x000002B15CF31358>, original = 7, cloned = None, target = 3 )
__main__.Solution.getTargetCopy ( self = <__main__.Solution object at 0x000002B15CF31358>, original = 7, cloned = 3, target = 3 )
None

所以也可以看到克隆樹從 7 向下遍歷到 4 然后檢查 4 的左右孩子都沒有,然后它檢查 7 的右孩子 3 並確認它與目標相同,此時在調用中cloned.val=3所以 return 語句應該返回值為 3 的節點,這應該是正確的答案,但它似乎返回 none,這甚至不是當時 cloned 的值(如打印語句所示)爭論)發生了什么事?

if條件不為真時,您不會return任何內容。

所以改變這兩行:

self.getTargetCopy(original, cloned.left, target)
self.getTargetCopy(original, cloned.right, target)

到:

res = self.getTargetCopy(original, cloned.left, target)
if res:
    return res
return self.getTargetCopy(original, cloned.right, target)

甚至(使用短路):

return (self.getTargetCopy(original, cloned.left, target)
     or self.getTargetCopy(original, cloned.right, target))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM