LeetCode 第十天 二叉树(end )python

以下题目来源力扣
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if(root==p or root==q or root==None):
            return root
        
        left_=self.lowestCommonAncestor(root.left,p,q)
        right_=self.lowestCommonAncestor(root.right,p,q)

        if (left_ and right_):
            return root
        if (left_==None and right_!=None):
            return right_
        elif left_!=None and right_==None:
            return left_
        else :
            return None

235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
利用二叉搜索树的有序性,只需要判断节点是否在【p,q】中

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if(root==p or root==q or root==None):
            return root

        if p.val>root.val and root.val<q.val:
            return self.lowestCommonAncestor(root.right,p,q)
            
        elif p.val<root.val and root.val>q.val:
            return self.lowestCommonAncestor(root.left,p,q)
        else:
            return root

701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

# 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 insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        
        if root==None:
            return TreeNode(val)

        if root.val<val :
            root.right= self.insertIntoBST(root.right, val)
        if root.val>val:
            root.left= self.insertIntoBST(root.left, val)
        return root

450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。

# 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 root.right
            elif root.left==None and root.right==None:
                return 
            elif root.left!=None and root.right==None:
                return root.left
            else:
                cur=root.right
                while(cur.left):
                    cur=cur.left
                cur.left=root.left #将删除节点的左子树放到删除节点的右子树最左边的节点
                root=root.right
                return root

        if root.val<key:
            root.right=self.deleteNode(root.right,key)
        if root.val>key:
            root.left=self.deleteNode(root.left,key)
        return root

669. 修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

# 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 
        if root.val>high : #一直找到符合的节点作为root的右子树
            return self.trimBST(root.left,low,high)
        if root.val<low :
            return self.trimBST(root.right,low,high)
        root.left=self.trimBST(root.left,low,high)
        root.right=self.trimBST(root.right,low,high)
        return root

108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 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]:
        def traversal(nums,left,right):
            if(left>right):
                return 
            mid=left+int((right-left)//2)
            # print(mid)
            root=TreeNode(nums[mid])
            root.left=traversal(nums,left,mid-1)
            root.right=traversal(nums,mid+1,right)
            return root
        return traversal(nums,0,len(nums)-1)

538. 把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。

# 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 convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        pre=0
        def traversal(root):
            nonlocal pre
            if root==None:
                return 
            traversal(root.right)
            root.val=root.val+pre
            pre=root.val
            traversal(root.left)
        traversal(root)
        return root

二叉树的题目就到这里了!好耶!

你可能感兴趣的:(Leetcode,leetcode,python,算法)