701.二叉搜索树中的插入操作
充分利用BST的性质,将需要插入的元素和节点的值进行比较来确定搜索的方向,当一直寻找发现找到的点为空的时候,就可以创建新节点返回
递归三要素:
- 返回值: 插好元素的“新“数的root
- 截止条件:为null 说明找到了子节点,返回新节点
- 单次递归木有逻辑。或者说逻辑就是 将返回的值赋值给left 或者right 。因为直接写在递归函数处,所以算是单层递归里没有逻辑
先找到节点,这里分2种情况: 找到 & 未找到节点 然后
3种情况:
- 需要删除的点是子节点,即左右子节点为空 -> 直接删除
- 左边有一个子节点 OR 右边有一个子节点 -> 剩下的一个节点代替该节点
- 左右子树皆有节点 -> 这里有2种方法都可以实现:如图假设我们需要删除“7”
- 将他的右子树中下一个最小的数(8)直接接上去代替删除节点,之后再把该节点从右节点中删除
//这里只写了第三种情况的逻辑代码
TreeNode newRoot = root.right;
//找到需要删除的点的下一个点“8”
while(newRoot.left != null){
newRoot = newRoot.left;
}
//将8 从一开始右子树中删除
root.right = deleteNode(root.right, newRoot.val);
//把之前的左右子树重新安到新节点上
newRoot.right = root.right;
newRoot.left = root.left;
return newRoot;
- 把右子树“9”直接接上,7 的左子树(456)直接接到 9 的左边子结点上
//右子树 的根节点9 代替了删除点
TreeNode tmp = root.right;
//找到删除点的下一个数
while(tmp.left!= null){
tmp = tmp.left;
}
//将之前的左子树直接插到tmp上
tmp.left = root.left;
//返回 9
return root.right;