题目地址:
https://leetcode.com/problems/flip-binary-tree-to-match-preorder-traversal/description/
给定一个 n n n个节点的二叉树,和长 n n n的数组 A A A,题目保证树节点的值各不相同。问能否通过交换若干节点的左右孩子,使得二叉树的前序遍历恰好就是 A A A。如果能,则返回一个被翻转的节点列表,如果不能,则返回一个只含 − 1 -1 −1的列表。题目保证树节点的值都非负。
思路是DFS。将 A A A作为参数带着一起做前序遍历,当有可能需要翻转的时候就翻转,如果发现了矛盾则返回false告诉调用者。代码如下:
class Solution {
public:
vector<int> flipMatchVoyage(TreeNode* root, vector<int>& v) {
int idx = 0;
vector<int> res;
if (!dfs(root, idx, v, res)) return {-1};
return res;
}
bool dfs(TreeNode* cur, int& idx, vector<int>& v, vector<int>& res) {
if (!cur) return true;
if (cur->val != v[idx]) return false;
idx++;
if (cur->left && cur->left->val != v[idx]) {
swap(cur->left, cur->right);
res.push_back(cur->val);
}
return dfs(cur->left, idx, v, res) && dfs(cur->right, idx, v, res);
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。