99. 恢复二叉搜索树(JAVA实现)
二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public void recoverTree(TreeNode root) {
//存储中序遍历的节点
List<TreeNode> posOrdered = new ArrayList<>();
TreeNode tmp = root;
//利用栈进行中序遍历
Stack<TreeNode> s = new Stack<>();
while (tmp != null || !s.empty()) {
while (tmp != null) {
s.push(tmp);
tmp = tmp.left;
}
tmp = s.pop();
posOrdered.add(tmp);
//对节点的val进行排序
for (int i = posOrdered.size() - 1; i > 0; i--) {
int a = posOrdered.get(i).val;
int b = posOrdered.get(i - 1).val;
if (a >= b) break;
posOrdered.get(i).val = b;
posOrdered.get(i - 1).val = a;
}
tmp = tmp.right;
}
}
}