BST刪除節點

2022-08-29 20:36:25 字數 1617 閱讀 2303

首先,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...