【樹】B042_LC_翻轉二叉樹以匹配先序遍歷(先序遍歷)

一、Problem

給定一個有 N 個節點的二叉樹,每個節點都有一個不同於其他節點且處於 {1, …, N} 中的值。通過交換節點的左子節點和右子節點,可以翻轉該二叉樹中的節點。

考慮從根節點開始的先序遍歷報告的 N 值序列。將這一 N 值序列稱爲樹的行程。

我們的目標是翻轉最少的樹中節點,以便樹的行程與給定的行程 voyage 相匹配。 如果可以,則返回翻轉的所有節點的值的列表。你可以按任何順序返回答案。如果不能,則返回列表 [-1]。

在這裏插入圖片描述

輸入:root = [1,2,3], voyage = [1,3,2]
輸出:[1]

提示:

1 <= N <= 100

二、Solution

方法一:先序遍歷

思路

題目比較難懂,說的其實是如果 voyage 數組就是一棵樹預期的先序遍歷,而我們要做到是遍歷並檢查 root 這棵樹;

如果根匹配 voyage 的根,那麼就檢查根的下一個結點是否與 voyage 的下一個結點匹配;如果不匹配,返回 {-1},如果匹配,就需要交換,那麼此時的該結點的行程就是該根結點的值

class Solution {
public:
	vector<int> tar, ans;
	int isMatch = 1, i;

	void dfs(TreeNode* root) {
		if (root == NULL || !isMatch)
			return;
		if (root->val != tar[i]) {
			isMatch = 0;
			return;
		}
		if (root->left != NULL && root->left->val != tar[i+1]) {
			swap(root->left, root->right);
			ans.push_back(root->val);
		}
        i++;
		dfs(root->left);
		dfs(root->right);
	}
    vector<int> flipMatchVoyage(TreeNode* root, vector<int>& voyage) {
    	tar = voyage;
    	dfs(root);
        if (!isMatch)
            return {-1};
    	return ans;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章