CodeTop整理-树篇

news2024/9/23 15:28:18

目录

103. 二叉树的锯齿形层次遍历

236. 二叉树的最近公共祖先

124. 二叉树中的最大路径和

102. 二叉树的层序遍历

94. 二叉树的中序遍历

110. 平衡二叉树

572. 另一个树的子树

96. 不同的二叉搜索树

543. 二叉树的直径

297. 二叉树的序列化与反序列化

199. 二叉树的右视图

105. 从前序与中序遍历序列构造二叉树

113. 路径总和 II

337. 打家劫舍 III

662. 二叉树最大宽度

104. 二叉树的最大深度

98. 验证二叉搜索树

101. 对称二叉树

144. 二叉树的前序遍历

1339. 分裂二叉树的最大乘积

450. 删除二叉搜索树中的节点

145. 二叉树的后序遍历

112. 路径总和

剑指 Offer 34. 二叉树中和为某一值的路径

129. 求根到叶子节点数字之和

226. 翻转二叉树

652. 寻找重复的子树

222. 完全二叉树的节点个数

257. 二叉树的所有路径

剑指 Offer 32 - III. 从上到下打印二叉树 III

剑指 Offer 07. 重建二叉树

剑指 Offer 54. 二叉搜索树的第k大节点


103. 二叉树的锯齿形层次遍历
# 103. 二叉树的锯齿形层序遍历
# 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
# 输入:root = [3,9,20,null,null,15,7]
# 输出:[[3],[20,9],[15,7]]


# 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

from typing import List
class Solution:
    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        ans=[]
        q=[root]
        level=0
        while len(q)>0:
            level_len=len(q)
            t=[]
            print(level_len,q)
            for i in range(level_len):
                cur=q[0]
                q.pop(0)
                if(cur):
                    t.append(cur.val)
                    if cur.left:
                        q.append(cur.left)
                    if cur.right:
                        q.append(cur.right)
            if level%2==1:
                t=t[::-1]
            ans.append(t)
            level+=1
        return ans
236. 二叉树的最近公共祖先

 

# 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':
        self.ans=None
        def dfs(root,p,q):
            if not root:
                return False
            l=dfs(root.left,p,q)
            r=dfs(root.right,p,q)
            if(l and r) or ((root.val==p.val or root.val==q.val) and (l or r)):
                self.ans=root
            return (root.val==p.val or root.val==q.val) or l or r
        dfs(root,p,q)
        return self.ans
124. 二叉树中的最大路径和
# 124. 二叉树中的最大路径和
# 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
# 路径和 是路径中各节点值的总和。
# 给你一个二叉树的根节点 root ,返回其 最大路径和 。
#
# 输入:root = [1,2,3]
# 输出:6
# 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

# 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 maxPathSum(self, root: Optional[TreeNode]) -> int:
        self.total=float('-inf')
        def dfs(root):
            if not root:
                return 0

            res_l=max(dfs(root.left),0)
            res_r=max(dfs(root.right),0)
            local_total=res_r+res_l+root.val
            self.total=max(local_total,self.total)
            return root.val+max(res_l,res_r)
        dfs(root)
        return self.total


'''
class Solution:
    def __init__(self):
        self.maxSum = float("-inf")

    def maxPathSum(self, root: TreeNode) -> int:
        def maxGain(node):
            if not node:
                return 0

            # 递归计算左右子节点的最大贡献值
            # 只有在最大贡献值大于 0 时,才会选取对应子节点
            leftGain = max(maxGain(node.left), 0)
            rightGain = max(maxGain(node.right), 0)

            # 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
            priceNewpath = node.val + leftGain + rightGain

            # 更新答案
            self.maxSum = max(self.maxSum, priceNewpath)

            # 返回节点的最大贡献值
            return node.val + max(leftGain, rightGain)

        maxGain(root)
        return self.maxSum
'''
102. 二叉树的层序遍历
# 102. 二叉树的层序遍历
# 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
# 输入:root = [3,9,20,null,null,15,7]
# 输出:[[3],[9,20],[15,7]]

# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        q=[root]
        ans=[]
        while q:
            level_len=len(q)
            t = []
            for i in range(level_len):
                cur=q[0]
                q.pop(0)
                if cur:
                    t.append(cur.val)
                    if cur.left:
                        q.append(cur.left)
                    if cur.right:
                        q.append(cur.right)
            ans.append(t)
        return ans
94. 二叉树的中序遍历
# 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
#         if root is None:
#             return []
#         return self.inorderTraversal(root.left)+[root.val]+self.inorderTraversal(root.right)

# 非递归
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        q=[]
        res=[]
        cur=root
        while cur or q:
            while cur:
                q.append(cur)
                cur=cur.left
            cur=q.pop()
            res.append(cur.val)
            cur=cur.right
        return res
110. 平衡二叉树
# 110. 平衡二叉树
# 给定一个二叉树,判断它是否是高度平衡的二叉树。
#
# 本题中,一棵高度平衡二叉树定义为:
# 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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 isBalanced(self, root: Optional[TreeNode]) -> bool:
        def get_high(a):
            if a==None:
                return 0
            return max(get_high(a.left),get_high(a.right))+1

        if root==None:
            return  True
        if(abs(get_high(root.left)-get_high(root.right))>1):
            return False
        return self.isBalanced(root.left) and self.isBalanced(root.right)
572. 另一个树的子树
# 572. 另一棵树的子树
# 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
#
# 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

# [3,4,5,1,2]   true
# [4,1,2]

# class Solution {
# public:
#     bool check(TreeNode *o, TreeNode *t) {
#         if (!o && !t) {
#             return true;
#         }
#         if ((o && !t) || (!o && t) || (o->val != t->val)) {
#             return false;
#         }
#         return check(o->left, t->left) && check(o->right, t->right);
#     }
#
#     bool dfs(TreeNode *o, TreeNode *t) {
#         if (!o) {
#             return false;
#         }
#         return check(o, t) || dfs(o->left, t) || dfs(o->right, t);
#     }
#
#     bool isSubtree(TreeNode *s, TreeNode *t) {
#         return dfs(s, t);
#     }
# };


# 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 isSubtree(self, root: TreeNode, subRoot: TreeNode) -> bool:
        def isSame(a,b):
            if not a and not b:
                return True

            if (not a and b) or (a and not b) or (a.val!=b.val):
                return False

            return isSame(a.left,b.left) and isSame(a.right,b.right)

        if (root==None) :
            return False
        return  isSame(root,subRoot) or  self.isSubtree(root.left,subRoot) or self.isSubtree(root.right,subRoot)
96. 不同的二叉搜索树
# 96. 不同的二叉搜索树
# 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
# dp[j] dp[j-1]*dp[i-j]  我们选择数字 j作为根,则根为j的所有二叉搜索树的集合是左子树集合和右子树集合乘积
class Solution:
    def numTrees(self, n: int) -> int:
        dp=[0]*(n+1)
        dp[0]=1
        dp[1]=1

        for i in range(2,n+1):
            for j in range(i+1):
                dp[i]+=dp[j-1]*dp[i-j]
        print(dp)
        return dp[n]

n=10
s=Solution()
r=s.numTrees(n)
print(r)
543. 二叉树的直径
# 543. 二叉树的直径
# 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
# 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
# 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 diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        self.diameter=0
        def dfs(root):
            if root==None:
                return 0
            high_l=dfs(root.left)
            high_r=dfs(root.right)
            local_diameter=high_r+high_l+1
            # print(high_l,high_r,local_diameter,max(high_l,high_r)+1)
            self.diameter=max(local_diameter,self.diameter)
            return max(high_l,high_r)+1
        dfs(root)
        return self.diameter-1
297. 二叉树的序列化与反序列化
# 297. 二叉树的序列化与反序列化
# 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
#
# 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
#
# 提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

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

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.

        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return 'None'     #相等于满二叉树了
        return str(root.val)+','+self.serialize(root.left)+','+self.serialize(root.right)

    def deserialize(self, data):
        """Decodes your encoded data to tree.

        :type data: str
        :rtype: TreeNode
        """
        def dfs(arr):
            if arr[0]=='None':
                arr.pop(0)
                return None
            val=arr[0]
            arr.pop(0)
            root=TreeNode(val)
            root.left=dfs(arr)
            root.right=dfs(arr)
            return root
        data_arr=data.split(',')
        root=dfs(data_arr)
        return root


# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
199. 二叉树的右视图
# 199. 二叉树的右视图
# 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
# 输入: [1,2,3,null,5,null,4]
# 输出: [1,3,4]
# 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

from typing import List
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        res=[]
        q=[root]
        while len(q)>0:
            level_len=len(q)
            for i in range(level_len):
                cur = q[0]
                q.pop(0)
                if cur:
                    if i == level_len - 1:
                        res.append(cur.val)
                    if cur.left:
                        q.append(cur.left)

                    if cur.right:
                        q.append(cur.right)
        return res



# class Solution:
#     def rightSideView(self, root: TreeNode) -> List[int]:
#         rightmost_value_at_depth = dict() # 深度为索引,存放节点的值
#         max_depth = -1
#
#         stack = [(root, 0)]
#         while stack:
#             node, depth = stack.pop()
#
#             if node is not None:
#                 # 维护二叉树的最大深度
#                 max_depth = max(max_depth, depth)
#
#                 # 如果不存在对应深度的节点我们才插入
#                 rightmost_value_at_depth.setdefault(depth, node.val)
#
#                 stack.append((node.left, depth + 1))
#                 stack.append((node.right, depth + 1))
#
#         return [rightmost_value_at_depth[depth] for depth in range(max_depth + 1)]
105. 从前序与中序遍历序列构造二叉树
# 105. 从前序与中序遍历序列构造二叉树
# 给定两个整数数组preorder 和 inorder,其中preorder 是二叉树的先序遍历, inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。
#
# 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
# 输出: [3,9,20,null,null,15,7]



# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
    def buildTree(self, preorder, inorder):
        if not preorder and not inorder:
            return None
        val=preorder[0]
        val_i=inorder.index(val)

        root=TreeNode(val)
        root.left=self.buildTree(preorder[1:val_i+1],inorder[0:val_i])
        root.right=self.buildTree(preorder[val_i+1:],inorder[val_i+1:])
        return root
113. 路径总和 II
# 113. 路径总和 II
# 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
#
# 叶子节点 是指没有子节点的节点。

# 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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        ans = []

        def dfs(root, target, path):
            if root == None:
                return
            if root.left == None and root.right == None:
                path.append(root.val)
                if target - root.val == 0:
                    ans.append(path[::])
                return

            dfs(root.left, target - root.val, path + [root.val])
            dfs(root.right, target - root.val, path + [root.val])

        dfs(root, targetSum, [])
        return ans



337. 打家劫舍 III
# 337. 打家劫舍 III
# 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。
#
# 除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
#
# 给定二叉树的root。返回在不触动警报的情况下,小偷能够盗取的最高金额。

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

        def dfs(root):
            if root==None:
                return [0,0]
            left_val=dfs(root.left)
            right_val=dfs(root.right)
            rob_0=max(left_val[0],left_val[1])+max(right_val[0],right_val[1])
            rob_1=left_val[0]+right_val[0]+root.val
            return  [rob_0,rob_1]

        return max(dfs(root))
662. 二叉树最大宽度
# 662. 二叉树最大宽度
# 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
#
# 树的 最大宽度 是所有层中最大的 宽度 。
#
# 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
#
# 题目数据保证答案将会在  32 位 带符号整数范围内。

# 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 widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        q=[[root,1]]
        global_wide=1
        while q:
            t = []
            for cur,i in q:
                if(cur.left):
                    t.append([cur.left,i*2])
                if(cur.right):
                    t.append([cur.right, i*2+1])
            local_wide = q[-1][1] - q[0][1]+1
            q = t
            global_wide=max(global_wide,local_wide)
        return global_wide
104. 二叉树的最大深度
# 104. 二叉树的最大深度
# 给定一个二叉树,找出其最大深度。
#
# 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
#
# 说明: 叶子节点是指没有子节点的节点。
#
# 示例:
# 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。

# 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 maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return max(self.maxDepth(root.left),self.maxDepth(root.right))+1
98. 验证二叉搜索树
# 98. 验证二叉搜索树
# 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
#
# 有效 二叉搜索树定义如下:
#
# 节点的左子树只包含 小于 当前节点的数。
# 节点的右子树只包含 大于 当前节点的数。
# 所有左子树和右子树自身必须也是二叉搜索树。
#
# 输入:root = [2,1,3]
# 输出:true

# 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 isValidBST(self, root: Optional[TreeNode]) -> bool:
        if root == None:
            return True

        self.pre = float('-inf')

        def dfs(root):
            if root == None:
                return True
            left_ = dfs(root.left)
            # print(self.pre,root)
            if (self.pre >= root.val):
                return False
            self.pre = root.val
            right_ = dfs(root.right)
            return left_ and right_

        return dfs(root)
101. 对称二叉树
# 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if root==None:
            return True
        def dfs(a,b):
            if(a==None and b==None):
                return True

            if(a!=None and b==None) or(a==None and b!=None) or (a.val!=b.val):
                return False

            left_t=dfs(a.left,b.right)
            right_t=dfs(a.right,b.left)

            return left_t and right_t
        return dfs(root.left,root.right)  
144. 二叉树的前序遍历
# 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if root==None:
            return []
        return [root.val]+self.preorderTraversal(root.left)+self.preorderTraversal(root.right)

1339. 分裂二叉树的最大乘积
# 1339. 分裂二叉树的最大乘积
# 给你一棵二叉树,它的根为root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。
#
# 由于答案可能会很大,请你将结果对 10^9 + 7 取模后再返回。
# 输入:root = [1,2,3,4,5,6]
# 输出:110
# 解释:删除红色的边,得到 2 棵子树,和分别为 11 和 10 。它们的乘积是 110 (11*10)

# 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 maxProduct(self, root: Optional[TreeNode]) -> int:
        def dfs(r):
            if r is None:
                return 0
            return dfs(r.left)+dfs(r.right)+r.val


        allSum=dfs(root)
        ans = 0

        print("allSum",allSum)


        def dfs2(r):
            nonlocal allSum
            nonlocal ans
            if r is None:
                return 0
            left_val=dfs2(r.left)
            right_val=dfs2(r.right)
            cur_sum=left_val+right_val+r.val
            ans=max((allSum-cur_sum)*cur_sum,ans)
            return cur_sum

        dfs2(root)

        return int(ans%(1e9 + 7))
450. 删除二叉搜索树中的节点
# 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 {
#     public TreeNode deleteNode(TreeNode root, int key) {
#         if (root == null) return null;
#         if (root.val == key) {
#             if (root.left == null) return root.right;
#             if (root.right == null) return root.left;
#             TreeNode t = root.left;
#             while (t.right != null) t = t.right;
#             t.right = root.right;
#             return root.left;
#         } else if (root.val < key) root.right = deleteNode(root.right, key);
#         else root.left = deleteNode(root.left, key);
#         return root;
#     }
# }

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if root == None:
            return None

        if(root.val==key):
            if root.left==None:
                return root.right
            if root.right==None:
                return root.left
            t=root.left    #最左右子树
            while t.right:
                t=t.right
            t.right=root.right
            return root.left
        elif(root.val<key):
            root.right=self.deleteNode(root.right,key)
        else:
            root.left=self.deleteNode(root.left,key)
        return root
145. 二叉树的后序遍历
# 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 postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if root==None:
            return []
        return self.postorderTraversal(root.left)+self.postorderTraversal(root.right)+[root.val]
112. 路径总和
# 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 hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if root==None:
            return False

        def dfs(root,target):
            if root==None:
                return False
            if root.right==None and root.left==None:
                if(target==root.val):
                    return True
                return False
            left_t=dfs(root.left,target-root.val)
            right_t=dfs(root.right,target-root.val)
            return left_t or right_t
        return dfs(root,targetSum)

剑指 Offer 34. 二叉树中和为某一值的路径
# 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 pathSum(self, root: TreeNode, target: int) -> List[List[int]]:
        if root==None:
            return []
        def dfs(root,target,path):
            if root==None:
                return []
            if root.left==None and root.right==None:
                if(root.val==target):
                    path.append(root.val)
                    self.ans.append(path[::])
                return
            dfs(root.left,target-root.val,path+[root.val])
            dfs(root.right,target-root.val,path+[root.val])
        self.ans=[]
        dfs(root,target,[])
        return self.ans
129. 求根到叶子节点数字之和

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

        def dfs(root,sumT):
            if root==None:
                return 0
            if root.left==None and root.right==None:
                sumT=10*sumT+root.val
                self.ans+=sumT
                return 

            dfs(root.left,10*sumT+root.val)
            dfs(root.right,10*sumT+root.val)
        dfs(root,0)
        return self.ans
226. 翻转二叉树
# 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 invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root==None:
            return None
        left_t=self.invertTree(root.left)
        right_t=self.invertTree(root.right)
        root.left=right_t
        root.right=left_t
        return root
652. 寻找重复的子树
class Solution:
    def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
        def dfs(node: Optional[TreeNode]) -> str:
            if not node:
                return ""

            serial = "".join([str(node.val), "(", dfs(node.left), ")(", dfs(node.right), ")"])
            if (tree := seen.get(serial, None)):
                repeat.add(tree)
            else:
                seen[serial] = node

            return serial

        seen = dict()
        repeat = set()

        dfs(root)
        return list(repeat)

链接:https://leetcode.cn/problems/find-duplicate-subtrees/solution/xun-zhao-zhong-fu-de-zi-shu-by-leetcode-zoncw/
222. 完全二叉树的节点个数
# 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 countNodes(self, root: Optional[TreeNode]) -> int:
        if root==None:
            return 0
        q=[root]
        ans=1
        while q:
            t=[]
            for cur in q:
                if cur.left:
                    t.append(cur.left)
                if cur.right:
                    t.append(cur.right)
            q=t
            ans+=len(q)
        return ans





class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        left=self.countNodes(root.left)
        right=self.countNodes(root.right)
        return left+right+1

257. 二叉树的所有路径
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        if root==None:
            return []
        self.ans=[]
        def dfs(root,path):
            if(root==None):
                return []
            if root.left==None and root.right==None:
                path.append(root.val)
                self.ans.append("->".join(map(str,path[::])))
                return 
            dfs(root.left,path+[root.val])
            dfs(root.right,path+[root.val])
        dfs(root,[])
        return self.ans
剑指 Offer 32 - III. 从上到下打印二叉树 III
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if root==None:
            return []
        q=[root]
        ans=[]
        i=0
        while q:
            t=[]
            res=[]
            for cur in q:
                res.append(cur.val)
                if cur.left:
                    t.append(cur.left)
                if cur.right:
                    t.append(cur.right)
            q=t
            if i%2==1:
                res=res[::-1]
            ans.append(res)
            i+=1
        return ans
剑指 Offer 07. 重建二叉树
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder)==0 or len(inorder)==0:
            return None

        val=preorder[0]
        idx=inorder.index(val)
        root=TreeNode(val)
        left_t=self.buildTree(preorder[1:idx+1],inorder[0:idx])
        right_t=self.buildTree(preorder[idx+1:],inorder[idx+1:])
        root.left=left_t
        root.right=right_t
        return root
剑指 Offer 54. 二叉搜索树的第k大节点
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def kthLargest(self, root: TreeNode, k: int) -> int:
        def dfs(root):
            if root==None:
                return []
            return dfs(root.left)+[root.val]+dfs(root.right)
        ans=dfs(root)
        # print(ans)
        return ans[len(ans)-k]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP-VRRP虚拟路由器冗余技术

VRRP-虚拟路由器冗余技术 文章目录 VRRP-虚拟路由器冗余技术一、拓扑结构二、基本配置三、测试验证四、知识点详解1.VRRP路由器2.报文格式3.工作过程 一、拓扑结构 二、基本配置 R1: #配置ip <Huawei>sys [Huawei]sys r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

快速排序算法!

快速排序 什么是快速排序&#xff08;quickSort&#xff09;&#xff1f; 主要分成两部分实现&#xff0c;分区、递归操作。 分区 从数组中任意选择一个 “基准”&#xff0c;所有比基准小的元素放在基准前面&#xff0c;比基准大的元素放在基本后面。 递归 递归地对基准…

Todo-List案例版本四

全局事件总线 使用步骤 1.定义全局事件总线 new Vue({...beforeCreated(){Vue.prototype.$busthis //安装全局事件总线&#xff0c;$bus就是当前应用的vm}... }) 2.使用事件总线 a.接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中给$bus绑定自定义事件&…

Outlook---撤回(或替换)已发出的邮件

0 Preface/Foreword 发送邮件时&#xff0c;发现邮件发错了&#xff0c;或者忘了添加附件&#xff0c;那么就需要用到撤回或者替换功能。 1 撤回/替换邮件方法 步骤如下&#xff1a; 第一步&#xff1a;双击打开邮件&#xff1b; 第二步&#xff1a;找到撤回按键

自锁电路分析与应用

原理图分享 今天工作中遇到一个设计很妙的电路&#xff0c;请教了一下硬件的工程师。 大家自己直接看图可以分享出这个电路的作用吗&#xff0c;可以在评论区告诉我哦&#xff01; 自锁电路 如上图就是一个自锁电路&#xff0c;和下面的电路一样&#xff1a; 电路现象描述&a…

23.RTC实时时钟

1.STM32 RTC介绍&#xff1a; &#xff08;1&#xff09;RTC简介&#xff1a; STM32的实时时钟(RTC)是一个独立的定时器。STM32的RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和…

虚幻5-could not find root physics body 布料系统问题解决方法

不做不知道自己身体好&#xff0c;又碰到问题了&#xff1a; could not find root physics body 1.据说是Skeleton 和SkeletaMesh傻傻分不清楚 &#xff08;但就是排查后&#xff0c;就不是这个问题&#xff09; 2.重新创造一个Physic Asset吧 Creating a New Physics Asse…

【C语言初阶(13)】三子棋游戏(优化:多子棋实现)

文章目录 一、游戏的实现思路二、游戏的实现步骤1. 菜单函数2. 设置棋盘3. 初始化棋盘4. 打印棋盘5. 玩家下棋6. 电脑下棋7. 多子棋判断输赢8. 判断棋盘是否已满 三、模块化代码实现1. test.c2. game.h3. game.c 四、结果演示 由于模块化编程的需要&#xff0c;我们需要把整个游…

解决Bridge材质导入到Blender为白色的问题

文章目录 前言一、复现问题二、解决方案总结 前言 一、复现问题 在Bridge上看到一块不错的草皮, 导入成功后是白色材质: 二、解决方案 以前用这个方法导入过模型, 那时候还没启用汉化, 也没什么材质问题. 这次操作之前刚启用了汉化, 我猜是汉化导致: 取消勾选’新建数据’, 重…

【Java】-初识java

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言…

Linux 基础之 TOP 命令详解

文章目录 一、前言二、Top说明 一、前言 TOP 命令是 Linux 常用的性能分析工具&#xff0c;能够实时显示系统中各个进程资源占用状况&#xff0c;类似于 Windows 的任务管理器。 二、Top说明 当使用一个工具时&#xff0c;对此最快的了解方式就是查看说明&#xff0c;那就是…

6.任务调度:保存和还原现场,时间片轮转

实现任务调度&#xff0c;模拟时间片 1.任务调度 在进行上下文切换时&#xff0c;需要保存和切换以下内容&#xff1a; 寄存器&#xff1a;包括通用寄存器&#xff08;如 EAX、EBX、ECX等&#xff09;和特殊寄存器&#xff08;如程序计数器 PC、堆栈指针 SP、基址指针 BP等&a…

LeetCode | C++ 动态规划——完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ

目录 完全背包518. 零钱兑换 II377. 组合总和 Ⅳ参考 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包…

【数据挖掘】时间序列教程【九】

第5章 状态空间模型和卡尔曼滤波 状态空间模型通常试图描述具有两个特征的现象 有一个底层系统具有时变的动态关系,因此系统在时间上的“状态”t 与系统在时间的状态t−1有关 .如果我们知道系统在时间上的状态t−1 ,那么我们就有了我们需要知道的一切,以便对当时的状态进行推…

12-ATF架构下的启动流程

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 1、Boot模型2、Boot示例3、Runtime模型4、异常跳转模型5、启动跳转模型

四川佳洲智谷:在AI潮水里加速快跑!

2023年6月28日夏季新品发布会上&#xff0c;摩卡掌舵人李国兴发布了国内首个AI原生HRSaaS整体解决方案——摩卡Eva。该产品的发布&#xff0c;标志着Moka正式成为业内第一家真正交付AI原生HRSaaS产品的公司。 随着AIGC浪潮的到来&#xff0c;越来越多的企业开始意识到人工智能的…

对抗性人工智能如何威胁您的机器学习模型

人工智能&#xff08;AI&#xff09;的出现给社会的几乎每个领域带来了革命性的变化。然而&#xff0c;人工智能的前景光明的能力也伴随着重大挑战&#xff0c;特别是在网络安全方面。 保护机器学习工作流程对于保护这些组织免受新兴威胁至关重要&#xff0c;而对抗性人工智能…

DeRPnStiNK靶机复盘

DeRPnStiNK靶机复盘 拿到靶机后我们第一步先扫描靶机地址。 nmap -sP 192.168.197.0/24扫描出我们的靶机地址。 扫描出来后我们再单独对这个ip进行扫描&#xff0c;发现开了三个端口 然后扫描一下目录&#xff0c;发现一个wordpress登陆网址和一个phpmyadmin登陆地址。 我们…

SOLARIS系统下ORACLE数据恢复案例

服务器数据恢复环境&#xff1a; 两台SPARC SOLARIS操作系统服务器通过光纤交换机共享一台存储作为集群使用。平时是一台服务器&#xff08;以下称为主服务器&#xff09;在运行&#xff0c;如果该服务器发生故障宕机&#xff0c;只需要将这台服务器关机后开启另外一台服务器&a…

Keepalived 安装与配置

安装 Keepalived apt -y install keepalived 里边有一个杠y&#xff0c;就是我安装的时候里面有yes&#xff0c;就直接是yes 添加 Keepalived 配置 安装好之后, 下一步就开始去来写这个配置文件了&#xff0c;就在这里面去建一个 etc 当中&#xff0c;就是在这个 etc 当中建一个…