# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def recoverTree(self, root: TreeNode) -> None:
first = second = prev = None
stack = []
curr = root
while stack or curr:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
if prev and prev.val > curr.val:
if not first:
first = prev
second = curr
prev = curr
curr = curr.right
if first and second:
first.val, second.val = second.val, first.val
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode *first = nullptr, *second = nullptr, *prev = nullptr;
std::stack<TreeNode*> stack;
TreeNode* curr = root;
while (!stack.empty() || curr) {
while (curr) {
stack.push(curr);
curr = curr->left;
}
curr = stack.top();
stack.pop();
if (prev && prev->val > curr->val) {
if (!first) first = prev;
second = curr;
}
prev = curr;
curr = curr->right;
}
if (first && second) {
std::swap(first->val, second->val);
}
}
};
// 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) {
TreeNode first = null, second = null, prev = null;
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while (!stack.isEmpty() || curr != null) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
if (prev != null && prev.val > curr.val) {
if (first == null) first = prev;
second = curr;
}
prev = curr;
curr = curr.right;
}
if (first != null && second != null) {
int tmp = first.val;
first.val = second.val;
second.val = tmp;
}
}
}
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {void} Do not return anything, modify root in-place instead.
*/
var recoverTree = function(root) {
let first = null, second = null, prev = null;
let stack = [];
let curr = root;
while (stack.length || curr) {
while (curr) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
if (prev && prev.val > curr.val) {
if (!first) first = prev;
second = curr;
}
prev = curr;
curr = curr.right;
}
if (first && second) {
let tmp = first.val;
first.val = second.val;
second.val = tmp;
}
};
TreeNode
root.prev
). If prev.val > current.val
, it's a violation.prev
, first
, and second
nodes to identify the swapped nodes.1 - 2 - 3
(in-order), but nodes 2 and 3 are swapped:3 / \ 1 4 / 2Step-by-step traversal:
first = 4
, second = 2
.1, 2, 3, 4
.