Python教程:將有序陣列轉換為二叉搜尋樹
題目:
將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序陣列:
[-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:
0
/
\
-3
9
/
/
-10
5
解題思路
思路:遞迴
先看題目所給出的要求以及限制。
- 將按照升序排列的有序陣列,轉換為一顆高度平衡二叉搜尋樹
- 高度平衡二叉樹:指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
在這裡,可以看到有序陣列是按照升序排序的。我們知道,二叉搜尋樹(BST)中序遍歷就是升序序列,那麼我們可以從這個角度出發,那麼問題就轉變為 從中序遍歷的序列中恢復二叉搜尋樹。
那麼任選一個元素作為根節點,以元素左邊的序列構建左子樹,右邊序列構建右子樹。
但是由於有限制條件,需要轉換為高度平衡二叉樹,根據前面給出高度平衡二叉樹的概念。那麼我們考慮選擇陣列的中間元素作為根節點來代替前面的任意選擇一個元素。
具體的實現程式碼如下。
程式碼實現
# Definition
for a binary tree node.
# class TreeNode:
# def __init__(
self, x):
#
self.val = x
#
self.left =
None
#
self.right = None
class Solution:
def sortedArrayToBST(
self, nums: List[int]) -> TreeNode:
def dfs(left, right):
if left > right:
# 表示空子樹
return
None
# 選取中間元素為根節點
mid = left + (right-left)
// 2
root = TreeNode(nums[mid])
# 中間元素左邊序列構建左子樹
# 右邊序列構建右子樹
root.left = dfs(left, mid-1)
root.right = dfs(mid+1, right)
return root
return dfs(0, len(nums)-1)
實現結果
總結
- 題目中提示,有序陣列是按照升序排序的,要將其轉換為高度平衡的二叉搜尋樹。因為陣列按照升序排序,而 BST 中序遍歷的序列是升序序列。那麼題目所求可變為求中序遍歷序列轉換為高度平衡二叉搜尋樹。
- 因為題目要求轉換為高度平衡二叉搜尋樹,那麼在陣列中,應該取中間元素作為根節點。中間元素左邊序列構建左子樹,右邊序列構建右子樹。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2702813/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LeetCode 108. 將有序陣列轉換為二叉搜尋樹LeetCode陣列
- LeetCode-108-將有序陣列轉換為二叉搜尋樹LeetCode陣列
- leetcode 108.將有序陣列轉換為二叉搜尋樹 JavaLeetCode陣列Java
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- 程式碼隨想錄 第23天 | 669. 修剪二叉搜尋樹 ● 108.將有序陣列轉換為二叉搜尋樹 ● 538.把二叉搜尋樹轉換為累加樹 ● 總結篇陣列
- 程式碼隨想錄演算法訓練營day23 | leetcode 669. 修剪二叉搜尋樹、108. 將有序陣列轉換為二叉搜尋樹、538. 把二叉搜尋樹轉換為累加樹演算法LeetCode陣列
- 程式碼隨想錄演算法訓練營,9月17日 | 669. 修剪二叉搜尋樹,108.將有序陣列轉換為二叉搜尋樹,538.把二叉搜尋樹轉換為累加樹演算法陣列
- 程式碼隨想錄演算法訓練營第23天 | 669. 修剪二叉搜尋樹、108.將有序陣列轉換為二叉搜尋樹、538.把二叉搜尋樹轉換為累加樹演算法陣列
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- 有序表和搜尋二叉樹二叉樹
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- 將兩個有序陣列合併為一個有序陣列陣列
- JavaScript將陣列轉換為字串JavaScript陣列字串
- 將字串陣列轉換為浮點數陣列字串陣列
- 二叉搜尋樹
- 二叉搜尋樹的python實現Python
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- Java將地圖轉換為陣列[Snippet]Java地圖陣列
- Java如何將字串轉換為字元陣列?Java字串字元陣列
- LeetCode 33——搜尋旋轉排序陣列LeetCode排序陣列
- [Python手撕]不同的二叉搜尋樹Python
- [Python手撕]判斷二叉搜尋樹Python
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- PHP陣列轉換為js陣列PHP陣列JS
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- Java中將 int[] 陣列 轉換為 List(ArrayList)Java陣列
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- LeetCode 81——搜尋旋轉排序陣列 IILeetCode排序陣列
- LeetCode33. 搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode#33搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33 搜尋旋轉排序陣列LeetCode排序陣列
- 【LeetCode(Java) - 33】搜尋旋轉排序陣列LeetCodeJava排序陣列
- leetCode33搜尋旋轉排序陣列LeetCode排序陣列
- 二叉樹的插入和搜尋–python實現二叉樹Python
- 從二分搜尋到二叉搜尋樹