看了别人的题解,记录一下,代码来源在文章末尾。
中序遍历
中序遍历的节点是升序遍历的,所以只要当前节点的值比上一个节点值小,便可以把上一节点赋给node1,当前节点赋给node2 当时不一定是相邻的节点要换,如下 是1和3 要换 而中序遍历本是 1 2 3 变为了3 2 1 所以node1不变 node2要一直被不满足条件的节点赋值 一开始是2 之后是1
[1,3,null,null,2]
代码
class Solution {
public:
TreeNode* pre;
TreeNode* node1;
TreeNode* node2;
void backtracking(TreeNode* node) {
if (node == NULL) return;
backtracking(node->left);
if (pre != NULL && node1 == NULL && node->val < pre->val) node1 = pre;
if (pre != NULL && node->val < pre->val) node2 = node;
pre = node;
backtracking(node->right);
}
void recoverTree(TreeNode* root) {
backtracking(root);
swap(node1->val, node2->val);
}
};