- 恢复二叉搜索树
给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。
示例 1:
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例 2:
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
提示:
树上节点的数目在范围 [2, 1000] 内
-231 <= Node.val <= 231 - 1
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
vector<int> inorder(TreeNode* root,vector<int>& vec)
{
if(root==nullptr)
return vec;
inorder(root->left,vec);
vec.push_back(root->val);
inorder(root->right,vec);
return vec;
}
pair<int,int> find_swapped_nums(vector<int>& vec)
{
int index1=-1,index2=-1;
for(int i=0;i<vec.size()-1;i++)
{
if(vec[i+1]<vec[i])
{
index2=i+1;
if(index1==-1)
{
index1=i;
}
else{
break;
}
}
}
int x=vec[index1],y=vec[index2];
return pair{x,y};
}
void recover_swapped(pair<int,int>& pair_swapped,TreeNode* root,int count)
{
if(root==nullptr)
return;
int x=pair_swapped.first;
int y=pair_swapped.second;
if(root->val==x||root->val==y)
{
root->val=root->val==x?y:x;
if(--count==0)
return;
}
recover_swapped(pair_swapped, root->left, count);
recover_swapped(pair_swapped, root->right, count);
}
public:
void recoverTree(TreeNode* root) {
if(root==nullptr)
return;
vector<int> vec;
vec=inorder(root,vec);
pair<int,int> pair_swapped=find_swapped_nums(vec);
recover_swapped(pair_swapped,root,2);
}
};