leetcode : Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?
思路很简单,即按照中根顺序遍历树,同时记录前一个节点的指针pre,如果pre->val > root->val; 则说明有一个节点是坏点,
并且第一次大于的时候,pre是坏点,第二次大于的时候,root是坏点
但是注意特殊情况即 被交换的两个节点在中根遍历序列中是连续的
这样的话只会发生一次大于的情况,所以可以在记录坏点的同时记下该坏点之后的那个指针
AC代码:
class Solution { public: void recoverTree(TreeNode *root) { vector<vector<TreeNode* >> badnodes; TreeNode * pre = NULL; inorder(root, badnodes, pre); if(badnodes.size() == 1){ swap(badnodes[0][0]->val,badnodes[0][1]->val); return; } swap(badnodes[0][0]->val,badnodes[1][0]->val); } void inorder(TreeNode *root, vector<vector<TreeNode *>> &badnodes, TreeNode *&pre){ if(root->left) inorder(root->left, badnodes, pre); if(!pre) pre = root; else if(badnodes.size() == 2) return; else if(pre->val > root->val){ if(badnodes.size() == 0){ vector<TreeNode*> temp; temp.push_back(pre); temp.push_back(root); badnodes.push_back(temp); } else if(badnodes.size() == 1){ vector<TreeNode *> temp; temp.push_back(root); badnodes.push_back(temp); } } pre = root; if(root->right) inorder(root->right, badnodes, pre); } };
浙公网安备 33010602011771号