1. :.删除二叉搜索树中的节点
题目链接: 450. 删除二叉搜索树中的节点 - 力扣(LeetCode)
应用条件:递归,有返回值
难点:
二叉树中的删除操作会比添加操作难很多,因为删除对应着结构也要跟着改变。所以删除要考虑的情况多一些,尤其是当遍历到当前的结点的值和要寻找的key值相同且当前节点左右孩子都不是none的时候,我们要先找到当前节点右子树的最左边的节点,再把当前节点的左子树放到右子树的最左边的节点的左节点。说实话看起来很绕,但最关键的就是要找的当前节点右子树的最左边的节点。
个人错误:
在对root.left 和root.right递归的时候没有输出返回值。
思路:
# 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 deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if root == None:
return root
if root.val == key:
if root.left == None and root.right == None:
return None
elif root.left == None and root.right != None:
return root.right
elif root.left != None and root.right == None:
return root.left
else:
cur = root.right
while cur.left is not None:
cur = cur.left
cur.left = root.left
return root.right
if root.val > key:
root.left = self.deleteNode(root.left,key)
if root.val < key:
root.right =self.deleteNode(root.right,key)
return root
2. :修剪二叉搜索树
题目链接: 669. 修剪二叉搜索树 - 力扣(LeetCode)
应用条件:递归,有返回值
难点:
遇到二叉搜索数和一个特定值进行比较的问题时,一定要想起二叉搜索数是有顺序的。
个人错误:
没有想到有返回值然后直接root.left = 递归root.left后的返回值,root.right 也同理。
思路:
# 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 not root:
return root
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
3. :将有序数组转换为二叉搜索树
题目链接: 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
应用条件:递归,有返回值
难点:
每次去最中间的元素然后一直遍历,有返回值当作前一个遍历节点的left和right
直接用mid=(left+right)//2可能会超出范围,用mid=left+(right - left)//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.trav(nums, 0, len(nums) - 1)
return root
def trav(self,nums,left,right):
if left > right:
return None
mid = left+(right-left)//2
root = TreeNode(nums[mid])
root.left = self.trav(nums, left, mid - 1)
root.right = self.trav(nums, mid + 1, right)
return root
4. :把二叉搜索树转换为累加树
题目链接: 538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
应用条件:递归,不返回值
难点:
从题目中看懂树是从右下角开始遍历的,像原先的题一样有一个pre节点,一个一个右中左遍历即可。当前节点的值变成当前节点 的值加上pre的值。
个人错误:
思路:
# 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 = None
self.summ = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.trav(root)
return root
def trav(self,root):
if root == None:
return root
self.convertBST(root.right)
if self.pre != None:
root.val = root.val + self.pre.val
self.pre = root
self.convertBST(root.left)