代码随想录算法训练营第二十三天|669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树
669. 修剪二叉搜索树
需要递归修剪。
[代码]
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution(object): 8 def trimBST(self, root, low, high): 9 """ 10 :type root: TreeNode 11 :type low: int 12 :type high: int 13 :rtype: TreeNode 14 """ 15 if not root: 16 return None 17 # 若当前root节点小于左界:只考虑其右子树,用于替代更新后的其本身,抛弃其左子树整体 18 if root.val < low: 19 return self.trimBST(root.right, low, high) 20 # 若当前root节点大于右界:只考虑其左子树,用于替代更新后的其本身,抛弃其右子树整体 21 if root.val > high: 22 return self.trimBST(root.right, low, hight) 23 24 if low <= root.val <= high: 25 root.left = self.trimBST(root.left, low, high) 26 root.right = self.trimBST(root.right, low, high) 27 # 返回更新后的剪枝过的当前节点root 28 return root
108. 将有序数组转换为二叉搜索树
【注意】
1.选举中间节点,分左右区间,递归遍历左右区间,构造左右子树-----平衡二叉树。
2.数组长度是偶数怎么取中间节点?取哪个都没关系。
3.区间定义很重要。取左闭右闭。
【代码】
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution(object): 8 def sortedArrayToBST(self, nums): 9 """ 10 :type nums: List[int] 11 :rtype: TreeNode 12 """ 13 ''' 14 构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间 15 必然是平衡树 16 左闭右闭区间 17 ''' 18 root = self.traversal(nums,0,len(nums)-1) 19 return root 20 21 def traversal(self, nums,left,right): 22 #停止条件左闭右闭,所以没有等于 23 if(left > right): 24 return None 25 # 确定左右界的中心,防越界 26 mid = left + (right - left) // 2 27 # 构建根节点 28 mid_root = TreeNode(nums[mid]) 29 # 构建以左右界的中心为分割点的左右子树 30 mid_root.left = self.traversal(nums, left, mid-1) 31 mid_root.right = self.traversal(nums, mid+1, right) 32 33 # 返回由被传入的左右界定义的某子树的根节点 34 return mid_root
538. 把二叉搜索树转换为累加树
【注意】
1.换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]。
2.从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
3.双指针。pre是前一个节点的数值。中间节点是处理逻辑。pre定义为数值型而不定义树就不会发生空指针异常。
【代码】
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution(object): 8 def __init__(self): 9 self.pre = 0 10 11 def convertBST(self, root): 12 """ 13 :type root: TreeNode 14 :rtype: TreeNode 15 """ 16 pre = 0 17 if not root: 18 return None 19 #右 20 self.convertBST(root.right) 21 #中 22 self.pre += root.val 23 root.val = self.pre 24 #左 25 self.convertBST(root.left) 26 27 return root
分类:
代码随想录刷题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?