代码一,对应力扣恢复二叉搜索树,代码见下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
vector<TreeNode*> ret;
void inorder(TreeNode *root){
if(root){
inorder(root->left);
ret.push_back(root);
inorder(root->right);}
}
public:
void recoverTree(TreeNode* root) {
ret.clear();
inorder(root);
TreeNode *x = NULL;
TreeNode *y = NULL;
for(int i=0; i<ret.size()-1; ++i){
if(ret[i]->val > ret[i+1]->val){
y = ret[i+1];
if(x == NULL){
x = ret[i];
}
}
}
if(x && y){
int tmp = x->val;
x->val = y->val;
y->val = tmp;
}
}
};
代码二,对应力扣,删除二叉搜索树中的节点,代码见下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int findMin(TreeNode *root){
if(root->left){
return findMin(root->left);
}
return root->val;
}
TreeNode* delRoot(TreeNode* root){
if(root->left == NULL){
TreeNode* delNode = root;
TreeNode* retNode = root->right;
delete delNode;
return retNode;
}else if(root->right == NULL){
TreeNode* delNode = root;
TreeNode* retNode = root->left;
delete delNode;
return retNode;
}else{
TreeNode* retNode = new TreeNode(0);
retNode->val = findMin(root->right);
retNode->right = deleteNode(root->right, retNode->val);
retNode->left = root->left;
return retNode;
}
return NULL;
}
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == NULL){
return NULL;
}
if(key < root->val){
root->left = deleteNode(root->left, key);
}else if(key > root->val){
root->right = deleteNode(root->right, key);
}else{
return delRoot(root);
}
return root;
}
};