Leetcode 971:翻轉二叉樹以匹配先序遍歷(超詳細的解法!!!)
阿新 • • 發佈:2019-01-09
給定一個有 N
個節點的二叉樹,每個節點都有一個不同於其他節點且處於 {1, ..., N}
中的值。
通過交換節點的左子節點和右子節點,可以翻轉該二叉樹中的節點。
考慮從根節點開始的先序遍歷報告的 N
值序列。將這一 N
值序列稱為樹的行程。
(回想一下,節點的先序遍歷意味著我們報告當前節點的值,然後先序遍歷左子節點,再先序遍歷右子節點。)
我們的目標是翻轉最少的樹中節點,以便樹的行程與給定的行程 voyage
相匹配。
如果可以,則返回翻轉的所有節點的值的列表。你可以按任何順序返回答案。
如果不能,則返回列表 [-1]
。
示例 1:
輸入:root = [1,2], voyage = [2,1]
輸出:[-1]
示例 2:
輸入:root = [1,2,3], voyage = [1,3,2]
輸出:[1]
示例 3:
輸入:root = [1,2,3], voyage = [1,2,3]
輸出:[]
提示:
1 <= N <= 100
解題思路
這個問題非常簡單,我們只要遍歷root
,然後遍歷voyage
,比較兩者的val
是不是一樣,不一樣的話,自然就不對,如果一樣的話,繼續遍歷下去即可。例如
我們發現此時的root.val
voyage[0]
一致,所以我們比較root.left
和root.right
。
我們發現此時root.left
和voyage[1]
不一樣,所以我們需要將root.left
和root.right
交換。
然後繼續判斷root.left
和voyage[1]
,並且判斷voyage[2]
和root.right
。
class Solution:
def flipMatchVoyage(self, root, voyage):
"""
:type root: TreeNode
:type voyage: List[int]
:rtype: List[int]
"""
res = list()
i = 0
def dfs(root):
nonlocal i
if not root:
return True
if root.val != voyage[i]:
return False
i += 1
if root.left and root.left.val != voyage[i]:
res.append(root.val)
root.left, root.right = root.right, root.left
return dfs(root.left) and dfs(root.right)
return res if dfs(root) else [-1]
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!