Recover Binary Search Tree
Q:
A:
mirrors中序遍历,发生错误的节点保存,最后交换,主要分两种情况,错误的两个节点相邻或者不相邻。还是有点烦躁的。
class Solution { public: void recoverTree(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function TreeNode* pre = NULL; TreeNode* cur = root; TreeNode* wrong_node1 = NULL; TreeNode* wrong_node2 = NULL; while (cur) { if (!cur->left) { if (pre && cur->val < pre->val) { if (!wrong_node1) { wrong_node1 = pre; wrong_node2 = cur; } else { wrong_node2 = cur; } } pre = cur; cur = cur->right; } else { TreeNode* tmp_node = cur->left; bool recovered = false; while (tmp_node->right) { if (tmp_node->right == cur) { tmp_node->right = NULL; recovered = true; if (cur->val < pre->val) { if (!wrong_node1) { wrong_node1 = pre; wrong_node2 = cur; } else { wrong_node2 = cur; } } pre = cur; cur = cur->right; break; } else { tmp_node = tmp_node->right; } } if (!recovered) { tmp_node->right = cur; cur = cur->left; } } } if (!wrong_node1 || !wrong_node2) return; swap(wrong_node1->val, wrong_node2->val); return; } };
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号