- 分析
这道题使用中序遍历来解决,关键是中间的访问。例如123,交换两个数字之后会变成 3 2 1。需要注意的是,如果pre -> val > root -> val的时候就说明遇到了出错的节点,第一个出错的节点是pre,第二个出错的节点是root。这一步需要耐心的分析。为了避免进行特殊处理,开始时给新建一个节点给pre,并把pre -> val的值设置成最小的值。 锻炼递归思维。
- 代码
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode* s = nullptr;
TreeNode* t = nullptr;
TreeNode* prev = new TreeNode(INT_MIN);
traverse(root, s, t, prev);
if(s != nullptr && t != nullptr){
int temp = s -> val;
s -> val = t -> val;
t -> val = temp;
}
delete prev;
}
void traverse(TreeNode* root, TreeNode*& s, TreeNode*& t, TreeNode*& prev){
if(!root) return;
traverse(root -> left,s, t, prev);
if(root -> val < prev -> val){
s = (s == NULL) ? prev : s;
t = root;
}
prev = root;
traverse(root -> right, s, t, prev);
}
};