演算法(從二叉搜尋數中刪除乙個節點)

2022-05-17 01:49:18 字數 1445 閱讀 2313

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

/*

* * definition for a binary tree node.

* type treenode struct */

func deletenode(root *treenode, key int) *treenode

if (key

< root.val)

else

if (key > root.val)

else

if (root.right ==nil)

//new 和 make的區別,要記住

//通過make建立物件 make只能建立slice chan map

//make 只能用來分配及初始化型別為 slice、map、chan 的資料。new 可以分配任意型別的資料;

//new 分配返回的是指標,即型別 *type。make 返回引用,即 type;

//new 分配的空間被清零。make 分配空間後,會進行初始化;

//make 函式只用於 map,slice 和 channel,並且不返回指標

node := new

(treenode)

node = findmin(root.right)

root.val = node.val

root.right = deletenode(root.right, node.val)

}return

root

}func findmin(node *treenode) *treenode

node = node.left

}return

node

}

二叉搜尋樹 刪除二叉搜尋樹中的節點

這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...

二叉搜尋樹 刪除節點

前幾天寫了簡單的二叉排序樹的實現,僅僅提供了插入和查詢操作,沒有寫刪除給定節點操作。現在補充過來,不過這個代價似乎太大了點 二叉排序樹的刪除操作主要有兩點要注意 1 必須修改的是刪除節點父節點的資訊 2 有四種情況需要考慮 刪除節點有無左右子樹的 4個組合 再加上一點就是要細心,考慮各種情況,例如根...

刪除二叉搜尋樹中的節點

刪除二叉搜尋樹中的節點 class solution cur left root left 把要刪除的結點root左子樹放在cur的左孩子位置 treenode tmp root 把root結點儲存一下,下面去刪除 root root right 返回舊root的右孩子作為新root delete ...