669.修剪二叉搜索树
题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树哔哩哔哩bilibili
思路:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
# todo 1.判定所有情况的返回值
# 如果节点为空,直接返回None
if not root:
return None
# 如果节点小于下边界,则删除节点左子树,继续向节点右子树寻找
if root.val < low:
# 符合要要求的右子树节点返回
right = self.trimBST(root.right,low,high)
return right
# 如果节点大于上边界,则删除节点右子树,继续向节点左子树寻找
if root.val > high:
# 符合要要求的左子树节点返回
left = self.trimBST(root.left,low,high)
return left
# todo 2.根据不同的情况将返回值接收
root.left = self.trimBST(root.left,low,high)
root.right = self.trimBST(root.right,low,high)
return root
108.将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树哔哩哔哩bilibili
思路:
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]) -> Optional[TreeNode]:
# 可以不用判空,当nums为空的话,递归函数中left<right,返回空
# if not nums:
# return
return self.traveral(nums, 0, len(nums) - 1)
def traveral(self, nums, left, right):
if left > right:
return
index = (right + left) // 2
node = TreeNode(nums[index])
node.left = self.traveral(nums, left, index - 1)
node.right = self.traveral(nums, index + 1, right)
return node
538.把二叉搜索树转换为累加树
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树哔哩哔哩bilibili
思路:
# 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 __init__(self):
self.sum_ = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return root
# 右
self.convertBST(root.right)
# 中
self.sum_ += root.val
root.val = self.sum_
# 左
self.convertBST(root.left)
return root
另一个方法是采用双指针法,一个指针cur记录当前节点,一个指针pre记录上一个节点值
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.pre = 0
self.traveral(root)
return root
def traveral(self, cur):
if not cur:
return
# 右
self.traveral(cur.right)
# 中
cur.val += self.pre
self.pre = cur.val
# 左
self.traveral(cur.left)