给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
root = [5,3,6,2,4,null,7]
key = 3
5
/\
3 6
/ \ \
2 4 7
调整后的为 [5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7
思路:使用迭代法进行节点的删除,首先遍历整个树,找到要删除的节点。
1.当前节点没有左右子树,直接删除
2.当前节点有一个子树,将子树替换到当前位置
3.当前节点有两个子树,有两种方法,将左子树中最大值替换当前节点或者右子树中最小的节点替换当前节点。
public TreeNode deleteNode(TreeNode root, int key) {
TreeNode cur=root;
TreeNode par=root;
boolean isleft=true;
if(root==null)
return root;
while(cur.val!=key){
//寻找删除的节点
if(cur.val<key){
par