首页 > 其他 > 详细

Leetcode Recover Binary Search Tree

时间:2014-02-12 15:30:11      阅读:341      评论:0      收藏:0      [点我收藏+]

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.


本题注意不能通过测试是否是合法二叉树来修复,而是要通过检查全局二叉树确定哪两个节点的值调换了。

检查全局二叉树就是通过检查哪两个值是不按由小到大的顺序的。

可以利用额外空间O(n)空间,也可以使用常量空间。

要点就是:利用一个数组如vector保存不合法的节点,最后恢复不合法节点。


如下面两个程序:

1 O(n)空间

void recoverTree(TreeNode *root) 
	{
		if (!root || !root->left && !root->right) return;

		vector<TreeNode *> v;
		getTreeVals(v, root);
		checkVals(v);
	}
	void getTreeVals(vector<TreeNode *> &v, TreeNode *root)
	{
		if (!root) return;
		getTreeVals(v, root->left);
		v.push_back(root);
		getTreeVals(v, root->right);
	}
	void checkVals(vector<TreeNode *> &v)
	{
		int n1 = -1, n2 = -1;
		//画表,根据各种情况,最后得出计算公式
		for (int i = 0; i < v.size()-1; i++)
		{
			if (v[i]->val > v[i+1]->val) 
			{
				if (n1 == -1) n1 = i;
				else n2 = i+1;
			}
		}
		if (n2 == -1) n2 = n1+1;
		swap(v[n1]->val, v[n2]->val);
	}

2 常量空间

void recoverTree(TreeNode *root) 
	{
		if (!root || !root->left && !root->right) return;

		vector<TreeNode *> v;
		TreeNode *p = nullptr;
		getTreeVals(v, root, p);
		swap(v.front()->val, v.back()->val);
	}
	void getTreeVals(vector<TreeNode *> &v, TreeNode *root, TreeNode *&pre)
	{
		if (!root) return;
		getTreeVals(v, root->left, pre);
		if (pre && pre->val > root->val) 
		{
			if (v.empty()) v.push_back(pre);
			v.push_back(root);
		}
		pre = root;
		getTreeVals(v, root->right, pre);
	}













Leetcode Recover Binary Search Tree

原文:http://blog.csdn.net/kenden23/article/details/17580561

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!