discuz 做视频网站,盐城网站建设hx1818,汕头网站建设方案开发,山西省建设厅网站目录
题目#xff1a;
示例#xff1a;
分析#xff1a;
代码#xff1a; 题目#xff1a; 示例#xff1a; 分析#xff1a;
题目给我们一棵二叉搜索树#xff0c;给我们一个目标值#xff0c;让我们删除节点值等于目标值的节点#xff0c;并且删除之后需要保持…目录
题目
示例
分析
代码 题目 示例 分析
题目给我们一棵二叉搜索树给我们一个目标值让我们删除节点值等于目标值的节点并且删除之后需要保持二叉搜索树的定义也就是任意一个节点的左子树上的所有节点的值都小于该节点的值右子树上的所有节点的值都大于该节点的值。
删除一个节点我们首先需要先找到这个节点根据二叉搜索树的定义我们遍历二叉树如果当前节点的值大于目标值那么目标值只能存在与当前节点的左子树我们就接着向左子树遍历反之向右子树遍历。
直到我们找到了目标节点我们需要把它删除并且还需要保持这是一棵二叉搜索树。我们可以知道目标节点的右子树上任意一个节点的值都比目标节点的左子树上任意一个节点的值更大所以我们可以把目标节点的右子树接到目标节点的左子树的最大的节点的右子树上再让目标节点的左子树顶替上原先目标节点的位置这样就完成了删除目标节点的这样的操作。
我们也可以是让目标节点的右子树顶替上原先目标节点的位置再在右子树里最小的节点的左子树接上目标节点的左子树这样也是可以的。都是满足二叉搜索树的定义。 代码
class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(rootnullptr) return root;if(root-valkey){if(root-rightnullptr) return root-left;if(root-leftnullptr) return root-right;TreeNode* noderoot-left;while(node-right) nodenode-right;node-rightroot-right;rootroot-left;}else if(root-valkey) root-rightdeleteNode(root-right,key);else if(root-valkey) root-leftdeleteNode(root-left,key);return root;}
};