题意:
给定一个先序遍历序列,给出一棵树,问能否通过翻转改树的某些左右子节点,使得该树的先序遍历序列等于给定的先序遍历序列
思路:
很基础的题目了,就是先序遍历一下,如果在这个节点的左子节点的值不等于行程中下一个值,但是右子节点的值等于,那么就翻转一下,如果两个子节点的值都不等于,那么就没有解了。
class Solution {
public:
vector<int>ve;
bool flag = true;
int num = 0;
vector<int> flipMatchVoyage(TreeNode* root, vector<int>& voyage) {
num = 0;ve.clear();flag = true;
dfs(root,voyage);
if(!flag){
ve.clear();
ve.push_back(-1);
}
return ve;
}
void dfs(TreeNode* root,vector<int>& voyage){
if(root->val!=voyage[num]){
flag = false;
}
if(!flag)return ;
if(root->left!=NULL){
if(root->left->val!=voyage[num+1]&&root->right!=NULL&&root->right->val==voyage[num+1]){
ve.push_back(root->val);
TreeNode* node = root->left;
root->left = root->right;
root->right = node;
}
num++;
dfs(root->left,voyage);
}
if(root->right!=NULL){
num++;
dfs(root->right,voyage);
}
}
};