问题描述:
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Follow up:
- A solution using O(n) space is pretty straight forward.
- Could you devise a constant space solution?
问题的大致意思就是将一个二叉树转换为搜索二叉树,而且空间复杂度在O(n)。
解题思路:
大体思路就是先用一个vector存下所有的值,然后排序,最后用中序遍历填回去。
这里需要注意的就是要保持null值的位置,所以在填充的时候遇到null值,需要跳过。
算法实现中,我们将复制和填充写在一个函数中,用一个字段ok表示不同的阶段(ok=0表示在复制,ok=1表示在填充)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/**
* 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:
vector<int> v;
int index = 0;
void inorder(TreeNode* root,int ok){
if(!root) return;
inorder(root->left, ok);
if(ok)
root->val = v[index++];
else
v.push_back(root->val);
inorder(root->right, ok);
}
void recoverTree(TreeNode* root) {
inorder(root, 0);
sort(v.begin(), v.end());
inorder(root, 1);
}
};