思路:
方法一:首先用中序遍历把树中的节点放到数组中,因为是对BST的中序遍历,所以数组应该是增序的。但是有两个节点逆序,找到它们:先从头到尾找到一个节点的val大于后面节点的val的节点,这就是第一个逆序的节点,然后从尾到头找一个节点的val小于前面节点的val的节点,这就是第二个逆序的节点,交换val,OK。
时间复杂度O(N),空间复杂度O(N)。
/**
* 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 {
private:
void dfs(vector<TreeNode*>& sort_list, TreeNode* node) {
if(node == nullptr) return;
if(node->left != nullptr) dfs(sort_list, node->left);
sort_list.push_back(node);
if(node->right != nullptr) dfs(sort_list, node->right);
}
public:
void recoverTree(TreeNode* root) {
vector<TreeNode*> sort_list;
//get node from tree based on inorder
dfs(sort_list, root);
//find two node
TreeNode *first, *second;
int size = sort_list.size();
//find : from begin to end
for(int i = 0; i < size - 1; ++i) {
if(sort_list[i]->val > sort_list[i+1]->val) {
first = sort_list[i];
break;
}
}
//find : from end to begin
for(int i = size-1; i > 0; --i) {
if(sort_list[i]->val < sort_list[i-1]->val) {
second = sort_list[i];
break;
}
}
//swap
swap(first->val, second->val);
}
};
方法二: