lc99-Recover Binary Search Tree 發表於 2016-10-16 | 分類於 leetcode | 0 comments | 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void recoverTree(TreeNode* root) { TreeNode* cur = root; TreeNode* prev = nullptr; int prev_val = INT_MIN; TreeNode* prev_node = nullptr; int swapped_val = INT_MAX; TreeNode* swapped_node = nullptr; bool sf = false; while(cur) { if (cur -> left == nullptr) { if (!sf && swapped_val != INT_MAX && cur -> val > swapped_val) { swapped_node -> val = prev_val; prev_node -> val = swapped_val; sf = true; } if (!sf && swapped_val == INT_MAX && cur -> val < prev_val) { swapped_val = prev_val; swapped_node = prev_node; // cout << "swapped: " << prev_val<<" "<<swapped_val; } prev_node = cur; prev_val = cur -> val; cur = cur -> right; } else { // find the qianqu jiedian prev = cur -> left; while (prev -> right != nullptr && prev -> right != cur) { prev = prev -> right; } if (prev -> right == nullptr) { prev -> right = cur; cur = cur -> left; } if (prev -> right == cur) { prev -> right = nullptr; if (!sf && swapped_val != INT_MAX && cur -> val > swapped_val) { swapped_node -> val = prev_val; prev_node -> val = swapped_val; sf = true; } if (!sf && swapped_val == INT_MAX && cur -> val < prev_val) { swapped_val = prev_val; swapped_node = prev_node; } prev_node = cur; prev_val = cur -> val; cur = cur -> right; } } } if (!sf) { swapped_node -> val = prev_val; prev_node -> val = swapped_val; cout << "swapped: "<<prev_val<<" "<<swapped_val; } }};