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) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
1. 中序遍历,存储数组
2. 排序数组
3. 重新赋值,恢复二叉树
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
void recoverTree(TreeNode* root) {
if(root==NULL)
return;
TreeMidVal(root);
TreeMidSort();
recover(root);
}
private:
vector<int> vec_val;
/* 中序遍历 */
void TreeMidVal(TreeNode *root){
if(root==NULL)
return;
TreeMidVal(root->left);
vec_val.push_back(root->val);
TreeMidVal(root->right);
}
/* 排序 */
void TreeMidSort(){
sort(vec_val.begin(),vec_val.end());
}
/* 恢复 */
void recover(TreeNode *root){
if(root==NULL)
return;
recover(root->left);
/* 赋值 */
root->val = vec_val.front();
vec_val.erase(vec_val.begin());
recover(root->right);
}
};
int main(){
Solution *ps = new Solution();
TreeNode *root = new TreeNode(1);
TreeNode *l1 = new TreeNode(3);
TreeNode *r2 = new TreeNode(2);
root->left = l1;
l1->right = r2;
ps->recoverTree(root);
return 0;
}