一、题意
二、解答过程
二叉搜索树的删除要比插入困难,复杂。同样需要递归!
二叉搜索树删除情况有五种:
- 没找到删除的节点,遍历到空节点直接返回了
- 找到删除的节点
- 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
- 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
- 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
- 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { //情况一:没有找到删除的节点,遍历到空节点直接返回 if(root==NULL) return root; if(root->val==key) { //情况二:左右孩子都为空(叶子节点),直接删除节点,返回NULL为根节点 //情况三:其左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点 if(root->left==NULL) return root->right; //情况四:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 else if(root->right==NULL) return root->left; /* 情况五:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右子树 树的最左面节点的左孩子的位置 返回删除节点右孩子为新的根节点 */ else { TreeNode *tmp=root->right; while(tmp&&tmp->left) { tmp=tmp->left; } swap(root->val,tmp->val); root->right=deleteNode(root->right,key); } } //被删除的节点key值在左子树,去左子树找就可以了(key值是我们要找的) if(root->val>key) { root->left=deleteNode(root->left,key); } //被删除的节点key值在右子树,去右子树找就可以 if(root->val<key) { root->right=deleteNode(root->right,key); } return root; } };