leetcode 450 删除二叉搜索树中的节点
见到二叉搜索树第一时间就应该想起用中序遍历,知道中序遍历之后接下来想如何删除节点了(左右遍历根据节点大小决定向左向右移动)
遍历找不到目标节点,就不用进行操作直接返回根节点就好了
当遍历找到要删除的节点(root)时,根据子树情况进行分类处理:
1.左右子树都为空:
这种情况直接返回nullptr就可以了,因为删除节点相当于把节点变为空
2.左子树空右子树不为空
这种情况把要删除节点直接赋值成他的右子树即可,相当于删除了root节点,也可以直接返回右子树
3.右子树空左子树不为空
这种情况同上一种一样,本质是返回新节点
4.左右子树都存在
这种情况需要把右子树的第一个节点的位置顶上到原来节点root的位置,而左子树应该接在右子树的最左边,返回右子树的第一个节点
再一次讲回有返回值的递归:
如果递归是有返回值的(非bool型),那么在递归的时候必然是有变量来承接递归的返回值的
因此设计递归的时候用变量来接返回值
如果是返回bool型的递归,可以用if条件来判断,这种情况一般是查找一条符合条件的路径