Recover Binary Search Tree

/*struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:
    void recoverTree(TreeNode *root) {
		TreeNode *p = root, *tmp;
		TreeNode *first=NULL,*second=NULL;
		TreeNode *pre=new TreeNode(INT_MIN);//pre 上一次访问的结点
		while (p) {  
			if (p->left == NULL) {
				if(p->val < pre->val)
				{
					if(first==NULL) first=pre;
					second=p;
				}
				pre=p;
				p = p->right;  
			}  
			else { 
				tmp = p->left;  
				while (tmp->right != NULL && tmp->right != p)  
					tmp = tmp->right;  
				if (tmp->right == NULL) {  
					tmp->right = p;
					p = p->left;  
				}  
				else { 
					if(p->val < pre->val)
				    {
					    if(first==NULL) first=pre;
					    second=p;
				    }
					pre=p;
					tmp->right = NULL;
					p = p->right;  
				}  
			}  
		}
		int _tmp=first->val;
		first->val=second->val;
		second->val=_tmp;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值