题目:恢复二叉搜索树
原题链接:恢复二叉搜索树
这道题的思路是这样的:先遍历树(哪种遍历方式无所谓),然后将得到树节点按照数据域的大小进行排序,再与原树的中序遍历进行比较。因为二叉搜索树的中序是从大到小的顺序的,所以每次遇到不相同的元素时,按照排序后的节点值进行更改即可。
/**
* 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;
inorder(root, vec);
sort(vec.begin(), vec.end());
recover(root, vec);
}
void inorder(TreeNode* root, vector<int> &vec){
if(root == NULL) return;
inorder(root->left, vec);
vec.push_back(root->val);
inorder(root->right, vec);
}
void recover(TreeNode* root, vector<int> &vec){
if(root == NULL) return;
recover(root->left, vec);
if(root->val == vec[0]){
vec.erase(vec.begin());
}
else{
root->val = vec[0];
vec.erase(vec.begin());
}
recover(root->right, vec);
}
};
题外话:
人要生活,就一定要有信仰。信仰是什么?相信一切事和一切时刻的合理的内在联系,相信生活作为整体将永远继续下去,相信最近的东西和最远的东西。
——卡夫卡《午夜的沉默》