您的位置:首页 > 其它

leetcode 099 —— Recover Binary Search Tree

2015-08-08 15:24 344 查看
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?
思路:

O(n)的方法就是 将树用中序遍历打印出来,从左往右搜索,记录两次s[i]>s[i+1]的时刻,第一次的s[i],和第二次的s[i+1],即是我们要找的两个破坏点

O(1)的方法就是,省去将数的元素全部排列的步骤,用三个指针,node1,node2,pre,分别记录 第一次的乱序的前一个点,node[2]记录每次乱序的第二个点。

pre是指扫描到当前节点时的前一个点。只有当pre->val > root->val 时,说明乱序了。

class Solution {
TreeNode *node1 = nullptr;
TreeNode *node2 = nullptr;
TreeNode *pre = nullptr;
public:
void recoverTree(TreeNode* root) {
searchTwo(root);
swap(node1->val, node2->val);
}
void searchTwo(TreeNode* root){
if (!root) return;
searchTwo(root->left);

if (pre&&pre->val > root->val){ //前一个点大于当前点,说明前一个点是破坏点
if (!node1)
node1 = pre; //第一个点可以确定下来,但是node2还是要往后继续搜索
node2 = root; //node2一直等于 root
}
pre = root;

searchTwo(root->right);
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: