Leetcode: 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.

 

 

思路:

1. A solution using O(n) space is pretty straight forward, 指的是中序遍历

2. 依然使用中序遍历, 但只需要维持大小为 2 的窗口即可

3. 具体来讲, 因为 BST 的中序遍历是一个递增的数组, 我们可以通过分析递增数组交换两个元素后的情况来进行编码, 当数组中连续的两个数交换时, 只会出现一次逆序, 否则, 必然恰好两次逆序, 所以, 我们设置一个 candidate[2] 来存储第一次逆序的两个节点. 假如发现了第二次逆序, 那么直接找到了, 若没发现第二次逆序, 那么必然是连续的两个数交换, candidate 中存储的两个节点就是答案

 

代码:

class Solution {
public:
	TreeNode* candidate[2];
	TreeNode* pre;
	bool findone;
	bool ans;
    void recoverTree(TreeNode *root) {
		if(root == NULL)
			return;

		ans = false;
		findone = false;

		pre = NULL;
		inorder(root);
		if(ans)
			return;
		else{
			int tmp = candidate[0]->val;
			candidate[0]->val = candidate[1]->val;
			candidate[1]->val = tmp;
		}
		// just for fun
		return;
    }

	void inorder(TreeNode *root) {
		if(root == NULL)
			return;

		if(root->left != NULL && !ans) 
			inorder(root->left);
		
		if(pre == NULL)
			pre = root;
		if(root->val < pre->val ) {	// findone
			if(findone) {	// 找到另一个
				int tmp = candidate[0]->val;
				candidate[0]->val = root->val;
				root->val = tmp;
				ans = true;
				
			}else{
				candidate[0] = pre;
				candidate[1] = root;
				findone = true;
			}
		}
		pre = root;
		if(root->right &&!ans)
			inorder(root->right);
	}
};

  

posted @ 2013-12-10 22:08  SangS  阅读(1379)  评论(0编辑  收藏  举报