题目:
分析:
本属于数据结构的基本问题(虽然已经忘完了),值的回顾一下。
分为三种情况:
1.根节点直接删除。
2.只有左子树或者右子树的直接删掉拼接。
3.既有左子树又有右子树的,则把左子树的最大值拿过来,或者是右子树的最小值拿过来!
虽然简单,但是写起来技巧性挺多的。
代码
/**
* 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 {
public:
TreeNode* deleteNode(TreeNode* root, int k) {
if(root==NULL) return root;
//寻找要删除的root的位置。
TreeNode* head=new TreeNode();
head->left=root;
head->val=root->val+1;
TreeNode* t1=head;
TreeNode* t2=head->left;
while(1)
{
if(t2==NULL) return root;
if(t2->val==k) break;
if(t2->val>k)
{
t1=t2;
t2=t2->left;
}
else{
t1=t2;
t2=t2->right;
}
}
//1
if(t2->left==NULL&&t2->right==NULL)
{
if(t1->val>k) t1->left=NULL;
else t1->right=NULL;
return head->left;
}
//2
if(t2->left==NULL)
{
if(t1->val>k) t1->left=t2->right;
else t1->right=t2->right;
return head->left;
}
if(t2->right==NULL)
{
if(t1->val>k) t1->left=t2->left;
else t1->right=t2->left;
return head->left;
}
//3 寻找左子树的最大值。 修改t2的值即可
cout<<t2->val;
TreeNode* p2=t2->left;
TreeNode* p1=t2->left;
if(p1->right==NULL)
{
t2->val=p2->val;
t2->left=p1->left;
return head->left;
}
p2=p1->right;
while(p2->right!=NULL)
{
p1=p2;
p2=p2->right;
}
t2->val=p2->val;
p1->right=p2->left;
return head->left;
}
};