Leetcode#99 Recover Binary Search Tree

原题地址

 

中序遍历二叉搜索树,正常情况下所有元素都应该按递增排列,如果有元素被交换,则会出现前面元素大于后面的情况,称作反序。由于交换了两个节点,所以通常会有两处反序,但如果是两个相邻节点发生了交换,则只会有一次反序。

注意,如果有两次反序,前面那次一定是较大数,后面那次一定是较小数

交换的时候注意只需要交换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 }

 

posted @ 2015-01-21 15:24  李舜阳  阅读(170)  评论(0编辑  收藏  举报