給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
首先找到需要刪除的節點;
如果找到了,刪除它。
說明: 要求演算法時間複雜度為 o(h),h 為樹的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5/ \
3 6
/ \ \
2 4 7
給定需要刪除的節點值是 3,所以我們首先找到 3 這個節點,然後刪除它。
乙個正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。
5/ \
4 6
/ \
2 7
另乙個正確答案是 [5,2,6,null,4,null,7]。
5/ \
2 6
\ \
4 7
如果目標節點沒有子節點,我們可以直接移除該目標節點。
如果目標節只有乙個子節點,我們可以用其子節點作為替換。
如果目標節點有兩個子節點,我們需要用其中序後繼節點或者前驅節點來替換,再刪除該目標節點。
class
treenode
:def
__init__
(self, x)
: self.val = x
self.left =
none
self.right =
none
def
deletenode
(self, root: treenode, key:
int)
-> treenode:
if root is
none
:return
none
if root.val == key:
if root.left is
none
:if root.right is
none
:#無子節點,直接刪除
return
none
else
: root = root.right #只有右兒子節點,用右兒子替換
elif root.right is
none
: root = root.left #只有左兒子節點,用左兒子替換
else
:buffer
=none
#buffer用於存放要替換節點的父節點
tmp = root.right
while tmp.left is
notnone
:buffer
= tmp
tmp = tmp.left
root.val, tmp.val = tmp.val, root.val
ifbuffer
isnone
:#buffer為空,則root的右兒子即是目標替換節點
root.right = self.deletenode(tmp, key)
else
:buffer
.left = self.deletenode(tmp, key)
elif key < root.val:
root.left = self.deletenode(root.left, key)
else
: root.right = self.deletenode(root.right, key)
return root
Python實現二叉搜尋
二叉搜尋是在乙個有序的列表中,尋找目標元素。因此我們需要對半查詢即可。當目標元素比中間元素小,則在中間元素的左邊查詢 反之,則在目標元素的右邊查詢。直到左邊界比右邊界還要大停止查詢。def binarysearch target,arr right len arr 1 left 0 while le...
python實現二叉搜尋樹
二叉搜尋樹 binary search tree 又名二叉排序樹 binary sort tree 二叉搜尋樹是具有有以下性質的二叉樹 1 若左子樹不為空,則左子樹上所有節點的值均小於或等於它的根節點的值。2 若右子樹不為空,則右子樹上所有節點的值均大於或等於它的根節點的值。3 左 右子樹也分別為二...
Python3 翻轉二叉樹的實現
提出問題 翻轉一棵二叉樹。除根結點以外 原始二叉樹 新二叉樹 解題思路 遇見二叉樹先想到遞迴。從最下層的葉子結點開始置換左右子節點,一直置換到到最上層的根結點的左右節點為止。如下 lqbogt definition for a binary tree node.class lqbogttreenod...