首页 > 代码库 > Recover Binary Search Tree

Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

 

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

 

中序遍历整棵树,bst的节点值则是有序的,如果发现前驱节点值大于当前节点值,那么就是异常情况

异常情况有两种,一种是前后相连的节点,另一种是不相连的节点,代码如下:

 1 /** 2  * Definition for binary tree 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10 class Solution {11 public:12     void recoverTree(TreeNode *root) {13         if( !root ) return ;14         stack<TreeNode*> st;15         TreeNode* cur = root;16         while( cur ) {17             st.push(cur);18             cur = cur->left;19         }20         TreeNode* pre = 0;21         TreeNode* fnode = 0;22         TreeNode* snode = 0;23         while( !st.empty() ) {24             cur = st.top();25             st.pop();26             if( pre && pre->val > cur->val ) {  //前驱值大于当前节点值时则为异常情况27                 if( !fnode ) fnode = pre, snode = cur;  //可能出现出错的两个节点刚好是前后连续的28                 else {29                     snode = cur;    //再次找到前驱值大于当前节点值,那么他们就不是相连的30                     break;31                 }32             }33             pre = cur;34             cur = cur->right;35             while( cur ) {36                 st.push(cur);37                 cur = cur->left;38             }39         }40         swap(fnode->val, snode->val);   //交换两节点的值41     }42 };

 

Recover Binary Search Tree