代码随想录算法训练营Day21
力扣669.修建二叉搜索树【medium】
力扣108.将有序数组转为二叉搜索树【easy】
力扣538.把二叉搜索树转为累加树【medium】
一、力扣669.修建二叉搜索树【medium】
题目链接:力扣669.修建二叉搜索树
视频链接:代码随想录
1、思路
-
涉及到了删除节点,是上一题的进阶
-
递归
- 修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
- 如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
- 如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
-
时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return None
if root.val < low:
return self.trimBST(root.right, low, high)
if root.val > high:
return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root
二、力扣108.将有序数组转为二叉搜索树【easy】
题目链接:力扣108.将有序数组转为二叉搜索树
视频链接:代码随想录
1、思路
- 如果根据数组构造一棵二叉树。本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
- 分割点就是数组中间位置的节点。
- 如果数组长度为偶数,中间节点有两个,取哪一个都可以,只不过构成了不同的平衡二叉搜索树。
- 时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
if not nums:
return None
m = len(nums) // 2
return TreeNode(nums[m], self.sortedArrayToBST(nums[: m]), self.sortedArrayToBST(nums[m+1 :]))
三、力扣538.把二叉搜索树转为累加树【medium】
题目链接:力扣538.把二叉搜索树转为累加树
视频链接:代码随想录
1、思路
- 和求最小绝对差和众数那两题做法类似
- 遍历顺序:右、中、左
- dfs:深度优先搜索
- 时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
s = 0
def dfs(node:Optional[TreeNode]) -> None:
if not node:
return
dfs(node.right)
nonlocal s
s += node.val
node.val = s
dfs(node.left)
dfs(root)
return root