二叉树专题做完了,递归(遍历)是二叉树结题的一大特点,递归算是掌握了,以后二刷的时候希望掌握迭代方法。
669. 修剪二叉搜索树
如果一个节点小于low,那么将他的左边节点置为None,对右边节点进行递归的修建操作;同理大于high,右边置为None,对左边进行操作
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
# 如果一个节点小于low,那么他的所有左边就都可以删除
# 然后就需要对右边进行操作:
if root == None:
return root
if low <= root.val <= high:
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
elif root.val > high:
root.right = None
return self.trimBST(root.left, low, high)
elif root.val < low:
root.left = None
return self.trimBST(root.right, low, high)
return root
108. 将有序数组转换为二叉搜索树
leetcode 108. 将有序数组转换为二叉搜索树
代码随想录
二分法,找中间,然后递归增加左右子树
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
# 二分法
length = len(nums)
# print(nums,length)
# print(length == 1)
if length == 0:
return None
elif length == 1:
return TreeNode(nums[0])
else:
pricot = int(length/2)
node = TreeNode(nums[pricot])
node.left = self.sortedArrayToBST(nums[:pricot])
node.right = self.sortedArrayToBST(nums[pricot + 1:])
return node
538. 把二叉搜索树转换为累加树
leetcode 538. 把二叉搜索树转换为累加树
代码随想录
进行右中左的遍历,弄一个节点记录后序节点,当前节点的值等于后序节点的值+当前节点的值;然后将当前节点记录为新的后序节点。
class Solution:
def __init__(self):
self.new_post = None
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
# 把标准的中序遍历改造 右中左
# 使用一个后序节点,记录新节点的值,当前节点的新值等于后序节点的值+当前节点的值
if root == None:
return
self.convertBST(root.right)
if self.new_post != None:
root.val = root.val + self.new_post.val
self.new_post = root
self.convertBST(root.left)
return root