代码随想录算法训练营第二十一天| leetcode669. 修剪二叉搜索树、leetcode108.将有序数组转换为二叉搜索树、leetcode538.把二叉搜索树转换为累加树
1 leetcode669. 修剪二叉搜索树
题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
思路:目前想的是分三种情况,第一种情况就是这个数删除左边全部,第二种删除右边的全部,第三种就是根据左右来定吧;返回的值,目前想的是这么干,但是感觉我分析的不对
1.1 自己的代码
这个代码,怎么说呢,过了一些,但是在中间的时候,就删除错误了,有过不了的例子,我觉得问题在于中间的时候,应该有一个返回值的问题,就是有一个继续判断,这个代码写的有点粗暴
# 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 trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if root==None:
return None
if root.val<low:
return root.right
elif root.val>high:
return root.left
root.left = self.trimBST(root.left,low,high)
root.right = self.trimBST(root.right,low,high)
return root
1.2 视频后的思路
问题:遍历的时候,没有考虑到如果在这个节点的右子树的左子树有不满足条件的情况下需要如何遍历
# 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 trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if root==None:
return None
if root.val<low:
right = self.trimBST(root.right,low,high)
return right
elif root.val>high:
left =self.trimBST(root.left,low,high)
return left
root.left = self.trimBST(root.left,low,high)
root.right = self.trimBST(root.right,low,high)
return root
1.3 本题小结
- 这道题自己尝试的时候就是没考虑如果在他的左边的右边有不满足要求的值或者右边的左边有不符合要求的值应该怎么办,考虑了以后就是正确的
2 leetcode108.将有序数组转换为二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
思路:有一种用了之前的裁剪方式,但是这里自己写的时候也报错了一点,注意就是终止条件要写,不然会有类似于死循环的感觉吧
2.1 自己的代码
# 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]) -> Optional[TreeNode]:
if len(nums)==0:
return
middle_num = len(nums)//2
val = nums[middle_num]
node = TreeNode(val)
left_num = nums[:len(nums)//2]
right_num = nums[len(nums)//2+1:]
node.left = self.sortedArrayToBST(left_num)
node.right = self.sortedArrayToBST(right_num)
return node
2.2 视频后的思路
视频双指针的方法,其实也挺巧妙的,感觉比我的切片方法会节省内存空间一些
# 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]) -> Optional[TreeNode]:
root= self.traversal(nums,0,len(nums)-1)
return root
def traversal(self,num,left,right):
if left>right:
return None
mid = left +(right-left)//2
root = TreeNode(num[mid])
root.left = self.traversal(num,left,mid-1)
root.right = self.traversal(num,mid+1,right)
return root
2.3 本题小结
- 这种题目,感觉还是要多些,自己看的时候就觉得真的已经掌握挺好的了,自己一动手写,上来就写错了
- 主要还是数组里面指针的掌握还没掌握的那么牢固
3 leetcode538.把二叉搜索树转换为累加树
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树_哔哩哔哩_bilibili
思路:这道题,我理解的是换一种遍历方式,有一种不知道怎么说的,就是先找到最大的那个数值,然后对其作为结点,上一个结点的值等于这个最大的加上自己的值,然后不断累加,最后得到一颗新的二叉树,叫累加数;但是呢,确实不知道怎么下手
3.1 视频后的思路
有一种勇敢的人先享受世界的感觉,做的时候就在想,要不用右中左的遍历顺序?但是觉得没有不敢写
# 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.pre = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root==None:
return
self.convertBST(root.right)
root.val +=self.pre
self.pre = root.val
self.convertBST(root.left)
return root
3.2 本题小结
- 这道题主要是思路上面,要敢于下手,我想到了,但是不敢写,纠结了一下,觉得这种方式没学过,不科学不合理,然后决定看完视频在写,发现和我想的一样
- 要记住,勇敢的人先享受世界,呜呜呜呜呜呜
4 今日小结
- 这四道题,相对而言都比较容易了吧,突然发现之前觉得难的递归我也能明白一些了,有两道题也是自己尝试写出来了
- 感慨:勇敢的人先享受世界!!
- 二叉树的知识,在这一刻就结束啦,从普通二叉树到平衡二叉树再到后面的二叉搜索树,一步步进步,一步步从看视频写题目到自己可以写出来,进步是有的,但是可以写的更好,希望二刷的时候越来越顺利