一、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;
}
};
复杂度分析
- 时间复杂度:,
- 空间复杂度:,