Skip to content

Commit d420634

Browse files
Merge pull request youngyangyang04#2096 from jianghongcheng/master
修改py
2 parents 58fb2cb + 832897e commit d420634

12 files changed

+633
-527
lines changed

problems/0098.验证二叉搜索树.md

+87-91
Original file line numberDiff line numberDiff line change
@@ -371,117 +371,113 @@ class Solution {
371371

372372
## Python
373373

374-
**递归** - 利用BST中序遍历特性,把树"压缩"成数组
374+
递归法(版本一)利用中序递增性质,转换成数组
375375
```python
376+
# Definition for a binary tree node.
377+
# class TreeNode:
378+
# def __init__(self, val=0, left=None, right=None):
379+
# self.val = val
380+
# self.left = left
381+
# self.right = right
376382
class Solution:
377-
def isValidBST(self, root: TreeNode) -> bool:
378-
# 思路: 利用BST中序遍历的特性.
379-
# 中序遍历输出的二叉搜索树节点的数值是有序序列
380-
candidate_list = []
381-
382-
def __traverse(root: TreeNode) -> None:
383-
nonlocal candidate_list
384-
if not root:
385-
return
386-
__traverse(root.left)
387-
candidate_list.append(root.val)
388-
__traverse(root.right)
389-
390-
def __is_sorted(nums: list) -> bool:
391-
for i in range(1, len(nums)):
392-
if nums[i] <= nums[i - 1]: # ⚠️ 注意: Leetcode定义二叉搜索树中不能有重复元素
393-
return False
394-
return True
395-
396-
__traverse(root)
397-
res = __is_sorted(candidate_list)
398-
399-
return res
383+
def __init__(self):
384+
self.vec = []
385+
386+
def traversal(self, root):
387+
if root is None:
388+
return
389+
self.traversal(root.left)
390+
self.vec.append(root.val) # 将二叉搜索树转换为有序数组
391+
self.traversal(root.right)
392+
393+
def isValidBST(self, root):
394+
self.vec = [] # 清空数组
395+
self.traversal(root)
396+
for i in range(1, len(self.vec)):
397+
# 注意要小于等于,搜索树里不能有相同元素
398+
if self.vec[i] <= self.vec[i - 1]:
399+
return False
400+
return True
401+
400402
```
401403

402-
**递归** - 标准做法
404+
递归法(版本二)设定极小值,进行比较
403405

404406
```python
405407
class Solution:
406-
def isValidBST(self, root: TreeNode) -> bool:
407-
# 规律: BST的中序遍历节点数值是从小到大.
408-
cur_max = -float("INF")
409-
def __isValidBST(root: TreeNode) -> bool:
410-
nonlocal cur_max
411-
412-
if not root:
413-
return True
414-
415-
is_left_valid = __isValidBST(root.left)
416-
if cur_max < root.val:
417-
cur_max = root.val
418-
else:
419-
return False
420-
is_right_valid = __isValidBST(root.right)
421-
422-
return is_left_valid and is_right_valid
423-
return __isValidBST(root)
408+
def __init__(self):
409+
self.maxVal = float('-inf') # 因为后台测试数据中有int最小值
410+
411+
def isValidBST(self, root):
412+
if root is None:
413+
return True
414+
415+
left = self.isValidBST(root.left)
416+
# 中序遍历,验证遍历的元素是不是从小到大
417+
if self.maxVal < root.val:
418+
self.maxVal = root.val
419+
else:
420+
return False
421+
right = self.isValidBST(root.right)
422+
423+
return left and right
424+
424425
```
425-
**递归** - 避免初始化最小值做法:
426+
递归法(版本三)直接取该树的最小值
426427
```python
428+
# Definition for a binary tree node.
429+
# class TreeNode:
430+
# def __init__(self, val=0, left=None, right=None):
431+
# self.val = val
432+
# self.left = left
433+
# self.right = right
427434
class Solution:
428-
def isValidBST(self, root: TreeNode) -> bool:
429-
# 规律: BST的中序遍历节点数值是从小到大.
430-
pre = None
431-
def __isValidBST(root: TreeNode) -> bool:
432-
nonlocal pre
433-
434-
if not root:
435-
return True
436-
437-
is_left_valid = __isValidBST(root.left)
438-
if pre and pre.val>=root.val: return False
439-
pre = root
440-
is_right_valid = __isValidBST(root.right)
441-
442-
return is_left_valid and is_right_valid
443-
return __isValidBST(root)
435+
def __init__(self):
436+
self.pre = None # 用来记录前一个节点
437+
438+
def isValidBST(self, root):
439+
if root is None:
440+
return True
441+
442+
left = self.isValidBST(root.left)
443+
444+
if self.pre is not None and self.pre.val >= root.val:
445+
return False
446+
self.pre = root # 记录前一个节点
447+
448+
right = self.isValidBST(root.right)
449+
return left and right
450+
451+
452+
444453
```
454+
迭代法
445455
```python
446-
迭代-中序遍历
456+
# Definition for a binary tree node.
457+
# class TreeNode:
458+
# def __init__(self, val=0, left=None, right=None):
459+
# self.val = val
460+
# self.left = left
461+
# self.right = right
447462
class Solution:
448-
def isValidBST(self, root: TreeNode) -> bool:
463+
def isValidBST(self, root):
449464
stack = []
450465
cur = root
451-
pre = None
452-
while cur or stack:
453-
if cur: # 指针来访问节点,访问到最底层
466+
pre = None # 记录前一个节点
467+
while cur is not None or len(stack) > 0:
468+
if cur is not None:
454469
stack.append(cur)
455-
cur = cur.left
456-
else: # 逐一处理节点
457-
cur = stack.pop()
458-
if pre and cur.val <= pre.val: # 比较当前节点和前节点的值的大小
470+
cur = cur.left #
471+
else:
472+
cur = stack.pop() #
473+
if pre is not None and cur.val <= pre.val:
459474
return False
460-
pre = cur
461-
cur = cur.right
475+
pre = cur # 保存前一个访问的结点
476+
cur = cur.right #
462477
return True
463478

464479
```
465-
```python
466-
# 遵循Carl的写法,只添加了节点判断的部分
467-
class Solution:
468-
def isValidBST(self, root: TreeNode) -> bool:
469-
# method 2
470-
que, pre = [], None
471-
while root or que:
472-
while root:
473-
que.append(root)
474-
root = root.left
475-
root = que.pop()
476-
# 对第一个节点只做记录,对后面的节点进行比较
477-
if pre is None:
478-
pre = root.val
479-
else:
480-
if pre >= root.val: return False
481-
pre = root.val
482-
root = root.right
483-
return True
484-
```
480+
485481

486482
## Go
487483

problems/0108.将有序数组转换为二叉搜索树.md

+46-54
Original file line numberDiff line numberDiff line change
@@ -316,73 +316,65 @@ class Solution {
316316
```
317317

318318
## Python
319-
**递归**
320-
319+
递归法
321320
```python
322-
# Definition for a binary tree node.
323-
# class TreeNode:
324-
# def __init__(self, val=0, left=None, right=None):
325-
# self.val = val
326-
# self.left = left
327-
# self.right = right
328321
class Solution:
329-
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
330-
'''
331-
构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间
332-
必然是平衡树
333-
左闭右闭区间
334-
'''
335-
# 返回根节点
336-
root = self.traversal(nums, 0, len(nums)-1)
337-
return root
338-
339322
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
340-
# Base Case
341323
if left > right:
342324
return None
343325

344-
# 确定左右界的中心,防越界
345326
mid = left + (right - left) // 2
346-
# 构建根节点
347-
mid_root = TreeNode(nums[mid])
348-
# 构建以左右界的中心为分割点的左右子树
349-
mid_root.left = self.traversal(nums, left, mid-1)
350-
mid_root.right = self.traversal(nums, mid+1, right)
351-
352-
# 返回由被传入的左右界定义的某子树的根节点
353-
return mid_root
327+
root = TreeNode(nums[mid])
328+
root.left = self.traversal(nums, left, mid - 1)
329+
root.right = self.traversal(nums, mid + 1, right)
330+
return root
331+
332+
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
333+
root = self.traversal(nums, 0, len(nums) - 1)
334+
return root
335+
354336
```
355337

356-
**迭代**(左闭右开)
338+
迭代法
357339
```python
340+
from collections import deque
341+
358342
class Solution:
359-
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
360-
if len(nums) == 0: return None
361-
root = TreeNode() # 初始化
362-
nodeSt = [root]
363-
leftSt = [0]
364-
rightSt = [len(nums)]
365-
366-
while nodeSt:
367-
node = nodeSt.pop() # 处理根节点
368-
left = leftSt.pop()
369-
right = rightSt.pop()
370-
mid = left + (right - left) // 2
371-
node.val = nums[mid]
372-
373-
if left < mid: # 处理左区间
374-
node.left = TreeNode()
375-
nodeSt.append(node.left)
376-
leftSt.append(left)
377-
rightSt.append(mid)
378-
379-
if right > mid + 1: # 处理右区间
380-
node.right = TreeNode()
381-
nodeSt.append(node.right)
382-
leftSt.append(mid + 1)
383-
rightSt.append(right)
343+
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
344+
if len(nums) == 0:
345+
return None
384346

347+
root = TreeNode(0) # 初始根节点
348+
nodeQue = deque() # 放遍历的节点
349+
leftQue = deque() # 保存左区间下标
350+
rightQue = deque() # 保存右区间下标
351+
352+
nodeQue.append(root) # 根节点入队列
353+
leftQue.append(0) # 0为左区间下标初始位置
354+
rightQue.append(len(nums) - 1) # len(nums) - 1为右区间下标初始位置
355+
356+
while nodeQue:
357+
curNode = nodeQue.popleft()
358+
left = leftQue.popleft()
359+
right = rightQue.popleft()
360+
mid = left + (right - left) // 2
361+
362+
curNode.val = nums[mid] # 将mid对应的元素给中间节点
363+
364+
if left <= mid - 1: # 处理左区间
365+
curNode.left = TreeNode(0)
366+
nodeQue.append(curNode.left)
367+
leftQue.append(left)
368+
rightQue.append(mid - 1)
369+
370+
if right >= mid + 1: # 处理右区间
371+
curNode.right = TreeNode(0)
372+
nodeQue.append(curNode.right)
373+
leftQue.append(mid + 1)
374+
rightQue.append(right)
375+
385376
return root
377+
386378
```
387379

388380
## Go

problems/0110.平衡二叉树.md

+10-12
Original file line numberDiff line numberDiff line change
@@ -536,18 +536,16 @@ class Solution:
536536

537537
```python
538538
class Solution:
539-
def isBalanced(self, root: TreeNode) -> bool:
540-
return self.height(root) != -1
541-
def height(self, node: TreeNode) -> int:
542-
if not node:
543-
return 0
544-
left = self.height(node.left)
545-
if left == -1:
546-
return -1
547-
right = self.height(node.right)
548-
if right == -1 or abs(left - right) > 1:
549-
return -1
550-
return max(left, right) + 1
539+
def isBalanced(self, root: Optional[TreeNode]) -> bool:
540+
return self.get_hight(root) != -1
541+
def get_hight(self, node):
542+
if not node:
543+
return 0
544+
left = self.get_hight(node.left)
545+
right = self.get_hight(node.right)
546+
if left == -1 or right == -1 or abs(left - right) > 1:
547+
return -1
548+
return max(left, right) + 1
551549
```
552550

553551

0 commit comments

Comments
 (0)