Recover Binary Search Tree 恢复发生错误的BST (重重重)!!!(参考别人的)

题目:

点击打开链接

参考:

http://blog.163.com/ya_mzy/blog/static/19959325520137153340725/

中序遍历 得到的正好是有序数组,如果发生无序, 记录节点,最后交换。

代码:

class Solution {
public:
	TreeNode *node1, *node2, *pre;

	void recoverTree(TreeNode *root) {
		node1 = node2 = pre = NULL;
		inorder(root);
		swap(node1->val, node2->val);
	}
private:
	void inorder(TreeNode *root)
	{
		if (root == NULL)
			return;
		//中序遍历
		if (root->left)
			inorder(root->left);
		//如果pre节点存在
		if (pre)
		{
			//如果发生顺序颠倒
			if (pre->val > root->val)
			{
				//如果是第一次颠倒
				if (node1 == NULL)
				{
					//记录两个颠倒的值,有可能正好是发生交换的两个值
					node1 = pre;
					node2 = root;
				}
				else
				{
					//记录第二次发生颠倒的后一个值
					node2 = root;
				}
			}
		}
		//更新pre 对于中序遍历,pre = root
		pre = root;
		if (root->right)
			inorder(root->right);

	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值