1. 程式人生 > >Leetcode 971:翻轉二叉樹以匹配先序遍歷(超詳細的解法!!!)

Leetcode 971:翻轉二叉樹以匹配先序遍歷(超詳細的解法!!!)

給定一個有 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. 1 <= N <= 100

解題思路

這個問題非常簡單,我們只要遍歷root,然後遍歷voyage,比較兩者的val是不是一樣,不一樣的話,自然就不對,如果一樣的話,繼續遍歷下去即可。例如

我們發現此時的root.val

voyage[0]一致,所以我們比較root.leftroot.right

我們發現此時root.leftvoyage[1]不一樣,所以我們需要將root.leftroot.right交換。

然後繼續判斷root.leftvoyage[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

如有問題,希望大家指出!!!