描述
给你二叉搜索树的根节点 root ,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。
分析
中序遍历找到颠倒的两个结点,交换他们的元素即可。
- 遍历过程中第一次遇到前一个结点比当前节点大的情况,则前一个结点便是第一个颠倒的结点。
- 遍历过程中第二次遇到前一个结点比当前节点大的情况,则后一个结点便是第二个颠倒的结点。
非递归的中序遍历:
只要当前结点不为空或栈不为空,则一直循环下去。
遍历一个结点,一直循环把它的左孩子压入栈,直到左孩子为空。
左孩子为空,弹出栈顶元素,遍历这个结点,然后把这个结点的右孩子作为当前结点,再次循环。
class Solution {
TreeNode cur ;
TreeNode pre = new TreeNode(Integer.MIN_VALUE);
TreeNode first = null;
TreeNode second = null;
Stack<TreeNode> stack = new Stack<>();
public void recoverTree(TreeNode root) {
cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode tmp = stack.pop();
if(first == null && pre.val > tmp.val){
first = pre;
}
if(first != null && pre.val > tmp.val){
second = tmp;
}
pre = tmp;
cur = tmp.right;
}
int num = first.val;
first.val = second.val;
second.val = num;
}
}