public void recoverTree(TreeNode root) {
		List<TreeNode> r=new ArrayList<>();
		TreeNode c=root, p=null;
		while (c!=null) {
			if (c.left!=null) {
				TreeNode t=c.left;
				while (t.right!=null&&t.right!=c)
					t=t.right;
				if (t.right==c) {
					if (p.val>c.val) {
						r.add(p);
						r.add(c);
					}
					p=c;
					t.right=null;
					c=c.right;
				} else {
					t.right=c;
					c=c.left;
				}
			} else {
				if (p!=null&&p.val>c.val) {
					r.add(p);
					r.add(c);
				}
				p=c;
				c=c.right;
			}
		}
		if (r.size()==2) 
			nodeSwap(r.get(0),r.get(1));
		else 
			nodeSwap(r.get(0), r.get(3));
	}