恢復二叉搜索樹
題目
二叉搜索樹中的兩個節點被錯誤地交換。
請在不改變其結構的情況下,恢復這棵樹。
示例
示例 1:
輸入: [1,3,null,null,2]
1
/
3
2
輸出: [3,1,null,null,2]
3
/
1
2
示例 2:
輸入: [3,1,4,null,null,2]
3
/
1 4
/
2
輸出: [2,1,4,null,null,3]
2
/
1 4
/
3
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路
何爲二叉搜索樹?
二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:
若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
它的左、右子樹也分別爲二叉排序樹。
可以知道在中序遍歷的情況下,是升序的。那麼思路就有了,把樹用中序遍歷後,再進行排序,再次進行中序遍歷,與sort之後的值進行比對,不等時進行值的交換。
代碼
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
vector<int>res;
vector<int>temp;
int now1=INT_MIN;
int now2=INT_MIN;
TreeNode*p1=NULL;
TreeNode*p2=NULL;
//中序遍歷
void inorder(TreeNode *now)
{
if(now)
{
inorder(now->left);
res.push_back(now->val);
inorder(now->right);
}
}
void find(TreeNode *now)
{
if(now!=NULL)
{
find(now->left);
if(now->val==now1)
{
p1=now;
}
if(now->val==now2)
{
p2=now;
}
find(now->right);
}
}
void recoverTree(TreeNode* root)
{
inorder(root);
temp=res;
sort(temp.begin(),temp.end());
for(int i=0;i<temp.size();i++)
{
if(temp[i]!=res[i])
{
if(now1==INT_MIN)
now1=temp[i];
else if(now2==INT_MIN)
{
now2=temp[i];
break;
}
}
}
find(root);
p1->val=now2;
p2->val=now1;
}
};