首先,bst節點的刪除分為幾種情況:
(a)當該節點為葉子節點,則讓該節點的父節點指向其變為null,然後釋放節點;
(b)當該節點不是葉子節點,但左子樹或者右子樹為空,則:
(1)若左子樹為空,則讓該節點父節點指向其右節點;
(2)若右子樹為空,則讓該節點父節點指向其左節點。
(c)當該節點不是葉子節點,且左子樹和右子樹都不為空,則:
(1)在該節點的左子樹中找到最大節點lmax(該節點必然是乙個葉子節點),取出lmax的值val,刪除lmax;
(2)將 val 賦給該節點的值,即:root->val = val。
(3)判斷lmax的父節點prelmax的左節點是否等於lmax,若是則:prelmax->left = lmax->left 否則: prelmax->right = lmax->left。
二叉搜尋樹的刪除複雜度為o(h),h是二叉樹的高度。**如下:
/*刪除二叉搜尋樹中的指定值的節點
*/node *deletenode(node *root, int
ele)
else
if(root->val else
}if(root ==null)
else
root->val = lmax->val; //
替換root的值為最大左子樹節點值
if(prelmax->left == lmax) //
root的左子樹最大節點是root的左節點
prelmax->left = lmax->left;
else
//root的左子樹最大節點不是root的左節點
prelmax->right = lmax->left;
delete
lmax;
lmax =null;
}//該節點的左子樹為空
else
if(root->left == null && root->right !=null)
else
if(1 == pos) //
在右側
else
//在左側
delete
root;
root =null;
}//該節點的右子樹為空
else
if(root->right == null && root->left != null) //
site的右子樹為空
else
if(1 == pos) //
在右側
else
//在左側
delete
root;
root =null;
}//該節點為葉子節點
else
else
if(1 == pos) //
在右側
else
//在左側
}
}return
newroot;
}
(樹 22)刪除BST中某個節點值為key的
450.刪除二叉搜尋樹中的節點 隨想錄 力扣發送門 分5種情況,第一種是翻個底朝天都找不到node val key的,說明刪除不了,返回空指標。第2 3 4 5種情況是找到了node val key的,那麼根據節點的左右孩子是否存在進行了討論。最複雜的是左右孩子都不為空的。需要將節點的左孩子,放到節...
BST 兩個節點的和
給定一棵bst和乙個常數k,判斷bst中是否存在兩個節點的和等於k。方法一 不使用bst的性質,用乙個列表儲存遍歷過的節點的 k val 值,如果後面的節點的值等於列表中的值,說明這個節點和前面某個節點的和等於k。class solution 方法二 利用bst的中序遍歷是有序佇列的性質,把bst的...
查詢節點 操作節點 刪除節點
insertbefore 在指定的已有子節點之前插入新的子節點 ul.insertbefore linew,li2 replacechild 該方法用新節點替換某個子節點 兩個引數 replacechild 要插入的節點,被替換的節點 返回被替換的節點 document.body.newnode v...