题目描述:
题解:
找规律,题目限制了只交换两个节点,那么在中序遍历的时候,用pre存中序遍历的前一个节点,如果当前节点(记为now)的值小于pre的值,那么now,pre中有一个是需要交换的节点。我们注意到,第一次出现上述情况的pre为需要交换的第一个节点,第二次出现上述情况的now节点为需要交换的第二个节点。当交换的节点为中序遍历中相邻的节点的时候,在比较的时候只会出现一次上述情况,将pre,now都记录下来即可。
AC代码:
class Solution { public: TreeNode* inorder(TreeNode* root) { if(root == NULL) return NULL; inorder(root->left); // if(pre != NULL )cout << pre->val <<endl; if(pre != NULL) { if(pre->val > root->val) { if(flag == 0) { node = pre; node2 = root; flag = 1; } else { node2 = root; flag = 2; } } } pre = root; TreeNode* end = inorder(root->right); if(end == NULL) return root; return end; } void recoverTree(TreeNode* root) { flag = 0; pre = NULL; node = NULL; node2 = NULL; inorder(root); // cout << node->val << endl; // cout << node2->val <<endl; int tmp = node->val; node->val = node2->val; node2->val = tmp; } private: int flag; TreeNode* node; TreeNode* node2; TreeNode* pre; };