题目:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例1:
输入: [1,3,null,null,2]
1
/
3
\
2
输出: [3,1,null,null,2]
3
/
1
\
2
示例 2:
输入: [3,1,4,null,null,2]
3
/ \
1 4
/
2
输出: [2,1,4,null,null,3]
2
/ \
1 4
/
3
算法:
迭代;
时间复杂度:
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)
代码:
/**
* 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) {
vector<int> vec;
recoverTree(root,vec);
sort(vec.begin(),vec.end());
recoverTree1(root,vec);
}
void recoverTree(TreeNode* root,vector<int>& vec){
if(!root) return;
recoverTree(root->left,vec);
vec.push_back(root->val);
recoverTree(root->right,vec);
}
void recoverTree1(TreeNode* root,vector<int>& vec){
if(!root) return;
recoverTree1(root->left,vec);
root->val=vec[0];
vec.erase(vec.begin());
recoverTree1(root->right,vec);
}
};
执行结果: