mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 20:40:39 +08:00
Update 0108.将有序数组转换为二叉搜索树.md
This commit is contained in:
@ -316,73 +316,65 @@ class Solution {
|
||||
```
|
||||
|
||||
## Python
|
||||
**递归**
|
||||
|
||||
递归法
|
||||
```python
|
||||
# Definition for a binary tree node.
|
||||
# class TreeNode:
|
||||
# def __init__(self, val=0, left=None, right=None):
|
||||
# self.val = val
|
||||
# self.left = left
|
||||
# self.right = right
|
||||
class Solution:
|
||||
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
|
||||
'''
|
||||
构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间
|
||||
必然是平衡树
|
||||
左闭右闭区间
|
||||
'''
|
||||
# 返回根节点
|
||||
root = self.traversal(nums, 0, len(nums)-1)
|
||||
return root
|
||||
|
||||
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
|
||||
# Base Case
|
||||
if left > right:
|
||||
return None
|
||||
|
||||
# 确定左右界的中心,防越界
|
||||
mid = left + (right - left) // 2
|
||||
# 构建根节点
|
||||
mid_root = TreeNode(nums[mid])
|
||||
# 构建以左右界的中心为分割点的左右子树
|
||||
mid_root.left = self.traversal(nums, left, mid-1)
|
||||
mid_root.right = self.traversal(nums, mid+1, right)
|
||||
root = TreeNode(nums[mid])
|
||||
root.left = self.traversal(nums, left, mid - 1)
|
||||
root.right = self.traversal(nums, mid + 1, right)
|
||||
return root
|
||||
|
||||
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
|
||||
root = self.traversal(nums, 0, len(nums) - 1)
|
||||
return root
|
||||
|
||||
# 返回由被传入的左右界定义的某子树的根节点
|
||||
return mid_root
|
||||
```
|
||||
|
||||
**迭代**(左闭右开)
|
||||
迭代法
|
||||
```python
|
||||
from collections import deque
|
||||
|
||||
class Solution:
|
||||
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
|
||||
if len(nums) == 0: return None
|
||||
root = TreeNode() # 初始化
|
||||
nodeSt = [root]
|
||||
leftSt = [0]
|
||||
rightSt = [len(nums)]
|
||||
|
||||
while nodeSt:
|
||||
node = nodeSt.pop() # 处理根节点
|
||||
left = leftSt.pop()
|
||||
right = rightSt.pop()
|
||||
mid = left + (right - left) // 2
|
||||
node.val = nums[mid]
|
||||
|
||||
if left < mid: # 处理左区间
|
||||
node.left = TreeNode()
|
||||
nodeSt.append(node.left)
|
||||
leftSt.append(left)
|
||||
rightSt.append(mid)
|
||||
|
||||
if right > mid + 1: # 处理右区间
|
||||
node.right = TreeNode()
|
||||
nodeSt.append(node.right)
|
||||
leftSt.append(mid + 1)
|
||||
rightSt.append(right)
|
||||
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
|
||||
if len(nums) == 0:
|
||||
return None
|
||||
|
||||
root = TreeNode(0) # 初始根节点
|
||||
nodeQue = deque() # 放遍历的节点
|
||||
leftQue = deque() # 保存左区间下标
|
||||
rightQue = deque() # 保存右区间下标
|
||||
|
||||
nodeQue.append(root) # 根节点入队列
|
||||
leftQue.append(0) # 0为左区间下标初始位置
|
||||
rightQue.append(len(nums) - 1) # len(nums) - 1为右区间下标初始位置
|
||||
|
||||
while nodeQue:
|
||||
curNode = nodeQue.popleft()
|
||||
left = leftQue.popleft()
|
||||
right = rightQue.popleft()
|
||||
mid = left + (right - left) // 2
|
||||
|
||||
curNode.val = nums[mid] # 将mid对应的元素给中间节点
|
||||
|
||||
if left <= mid - 1: # 处理左区间
|
||||
curNode.left = TreeNode(0)
|
||||
nodeQue.append(curNode.left)
|
||||
leftQue.append(left)
|
||||
rightQue.append(mid - 1)
|
||||
|
||||
if right >= mid + 1: # 处理右区间
|
||||
curNode.right = TreeNode(0)
|
||||
nodeQue.append(curNode.right)
|
||||
leftQue.append(mid + 1)
|
||||
rightQue.append(right)
|
||||
|
||||
return root
|
||||
|
||||
```
|
||||
|
||||
## Go
|
||||
|
Reference in New Issue
Block a user