Python3實現刪除二叉搜尋樹中的節點

2021-09-17 02:12:32 字數 1928 閱讀 7606

給定乙個二叉搜尋樹的根節點 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...