题意:给定一个二叉搜索树,其中有两个元素的顺序被对调了,请找出这两个元素
思路:用pre节点代表前一个被遍历的节点,root节点代表当前被遍历的节点,如果pre->val>root->val则顺序有问题。如果出现1次,则把这两个元素的值交换;如果出现两次,则把第一次的pre和第二次的root值交换。
其他到没啥,主要想清楚pre节点的记录方法。
代码:
/**
* 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:
TreeNode *pre;
vector<TreeNode *> res;
void traverse(TreeNode * root)
{
if(root==NULL) return;
traverse(root->left);
if(pre!=NULL)
{
if(pre->val>root->val)
{
res.push_back(pre);
res.push_back(root);
}
}
pre=root;
traverse(root->right);
}
void recoverTree(TreeNode* root) {
traverse(root);
if(res.size()==2) swap(res[0]->val,res[1]->val);
else swap(res[0]->val,res[3]->val);
}
};