主页有其他数据结构内容(持续更新中)
难度:Medium
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* pre;
TreeNode* node1;
TreeNode* node2;
void Inorder(TreeNode* node) {
if (node == nullptr) {
return;
}
Inorder(node->left);
// 若不是第一个节点,并且node1之前没有出现,但是现在出现了,因此要记录下来(node1被记录下后就不会变)
if (pre != nullptr && node1 == nullptr && node->val < pre->val) {
node1 = pre;
}
// 若不是第一个节点,并且node1已经出现过了,又满足node2的条件,因此要记录下来
// 这里判断语句用if而不是else if,是因为如果两个位置错乱的节点是紧挨着的,用if可以及时判断到,而用else if就会漏掉这个错误的位置;如果两个位置错乱的节点不靠在一起,这里也只是用node2临时记录一下,等到下一个真正的位置错乱节点出现,就会将node2更新
if (pre != nullptr && node1 != nullptr && node->val < pre->val) {
node2 = node;
}
pre = node;
Inorder(node->right);
}
void recoverTree(TreeNode* root) {
Inorder(root);
swap(node1->val, node2->val);
}
};