给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。
class Solution {
public:
void recoverTree(TreeNode* root) {
stack<TreeNode*> stk;//栈
TreeNode* x = nullptr;
TreeNode* y = nullptr;
TreeNode* pred = nullptr;
while (!stk.empty() || root != nullptr) {//栈不为空且root有效
while (root != nullptr) {//左压入
stk.push(root);
root = root->left;
}
root = stk.top();//取出栈最顶元素
stk.pop();
if (pred != nullptr && root->val < pred->val) {//前节点不为空,且大于当前节点
y = root;//y赋值当前节点
if (x == nullptr) {//x赋值前一节点
x = pred;
}
else break;
}
pred = root;//步进
root = root->right;
}
swap(x->val, y->val);
}
};