中序遍历二叉搜索树,正常情况下所有元素都应该按递增排列,如果有元素被交换,则会出现前面元素大于后面的情况,称作反序。由于交换了两个节点,所以通常会有两处反序,但如果是两个相邻节点发生了交换,则只会有一次反序。
注意,如果有两次反序,前面那次一定是较大数,后面那次一定是较小数
交换的时候注意只需要交换value就行了,别傻不啦叽的去交换节点。
代码:
1 vector<pair<TreeNode *, TreeNode *> > nodes; 2 TreeNode *prev; 3 4 void inorderTraverse(TreeNode *curr) { 5 if (!curr) 6 return; 7 inorderTraverse(curr->left); 8 if (prev && prev->val > curr->val) 9 nodes.push_back(pair<TreeNode *, TreeNode *>(prev, curr)); 10 prev = curr; 11 inorderTraverse(curr->right); 12 } 13 14 void recoverTree(TreeNode *root) { 15 inorderTraverse(root); 16 if (nodes.size() == 1) { 17 int tmp = nodes[0].first->val; 18 nodes[0].first->val = nodes[0].second->val; 19 nodes[0].second->val = tmp; 20 } 21 if (nodes.size() == 2) { 22 int tmp = nodes[0].first->val; 23 nodes[0].first->val = nodes[1].second->val; 24 nodes[1].second->val = tmp; 25 } 26 }