其实我的解法不符合题意的。。。TAT
不过我觉得O(1)的空间复杂度那种遍历方法似乎也没太大用吧。
其实就是中序遍历二叉树,那么得到一个序列。
按理说应该是递增的,不过有两个交换了,那么找出这两个就好了。
(在这里有卡了,写代码能力好弱啊。。。。。
我们首先顺序找到第一个不符合的(当然就是比后面的数字要大的。。。因为交换肯定把大的换前面了
然后再从这个开始扫描,找到第一个大于这个数的节点(那么前面这个就是需要找的啦
ex.
1 2 3 4 5
交换
4 2 3 1 5
开始找到4
然后找到5
5前面是1
交换1,4
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void travel(TreeNode* root , vector<TreeNode*>& que){ if(root == nullptr) return; travel(root -> left,que); que.push_back(root); travel(root -> right,que); } void recoverTree(TreeNode *root) { vector<TreeNode*> que; travel(root , que); int size = que.size(); TreeNode* first = nullptr; TreeNode* second = nullptr; for(int i = 0 ; i < size ; i++){ if(first == nullptr && i + 1 < size && que[i]->val > que[i+1]-> val){ first = que[i]; i ++; while(i < size && que[i] -> val < first -> val ) i++; if(i == size){ second = que.back(); }else{ second = que[i - 1]; } swap(first -> val , second -> val); } } } };
by 1957