一、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;
}
};
複雜度分析
- 時間複雜度:,
- 空間複雜度:,