669. 修剪二叉搜索树
代码随想录:669. 修剪二叉搜索树
Leetcode:669. 修剪二叉搜索树
做题
一个节点不在区间内,但它的左子树和右子树可能在区间内。思路能理解,但代码写不出来。
看文章
递归法
class Solution:
def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
if root is None:
return None
if root.val < low:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.right, low, high)
if root.val > high:
# 寻找符合区间 [low, high] 的节点
return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high) # root.left 接入符合条件的左孩子
root.right = self.trimBST(root.right, low, high) # root.right 接入符合条件的右孩子
return root
迭代法
class Solution:
def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode:
if not root:
return None
# 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭
while root and (root.val < L or root.val > R):
if root.val < L:
root = root.right # 小于L往右走
else:
root = root.left # 大于R往左走
cur = root
# 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况
while cur:
while cur.left and cur.left.val < L:
cur.left = cur.left.right
cur = cur.left # 左孩子的左孩子也需要继续判别,直到None
cur = root
# 此时root已经在[L, R] 范围内,处理右孩子大于R的情况
while cur:
while cur.right and cur.right.val > R:
cur.right = cur.right.left
cur = cur.right
return root
108.将有序数组转换为二叉搜索树
代码随想录:108.将有序数组转换为二叉搜索树
Leetcode:108.将有序数组转换为二叉搜索树
做题
无思路。
看文章
为什么要强调转换成平衡二叉树?因为如果不强调,就可以直接用线性结构来构造二叉树。
解题的本质是寻找分割点,然后递归左右区间。二叉搜索树的中序遍历是有序数组,那么反过来,有序数组的最中间数就应该是root,所以,第一个分割点只需要取中间值(显然,如果数组长度为偶数,中间值就有2个,也就对应了两个解法)。
根据这个思路,自己尝试实现一下,AC了,代码如下:
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
size = len(nums)
if size == 0:
return None
root_index = size // 2
root_val = nums[root_index]
root = TreeNode(val=root_val)
nums_left = nums[:root_index]
nums_right = nums[root_index+1:]
root.left = self.sortedArrayToBST(nums_left)
root.right = self.sortedArrayToBST(nums_right)
return root
538.把二叉搜索树转换为累加树
代码随想录:538.把二叉搜索树转换为累加树
Leetcode:538.把二叉搜索树转换为累加树
做题
无思路。
看文章
二叉搜索树的中序遍历是有序数组,那么,累加树只需要用反中序遍历(右中左),然后在遍历过程中不断叠加self.cur,然后更新root.val就可以了。自己尝试实现以下,AC了,代码如下:
class Solution:
def __init__(self):
self.cur = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None:
return
self.convertBST(root.right)
self.cur += root.val
root.val = self.cur
self.convertBST(root.left)
return root
二叉树总结
以往忽略的知识点小结
- 不断利用搜索二叉树的特性进行解题
- 深度遍历是遍历到最底层,再往上返回
个人体会
完成时间:1h。
心得:题其实不难,但是一开始思路总是有点懵,看了提示之后也能自己实现;时间转瞬即逝,二叉树居然已经刷到了尾声,之前自己刷的时候,就是看到题目很多,刷到一半后没耐心再刷下去,还是要感谢训练营的“监督”,不管每次有没有很认真地刷,但“刷完”,理解完所有思路,我觉得也是一种不错的进步了。继续加油!!!