首页 > 编程语言 >代码随想录算法训练营第15天 |

代码随想录算法训练营第15天 |

时间:2024-06-17 11:00:13浏览次数:12  
标签:node right 15 训练营 随想录 return root self left

代码随想录算法训练营第15天

翻转二叉树
https://leetcode.cn/problems/invert-binary-tree/description/
翻转二叉树代码随想录
https://programmercarl.com/0226.翻转二叉树.html
对称二叉树题
https://leetcode.cn/problems/symmetric-tree/
对称二叉树代码随想录
https://programmercarl.com/0101.对称二叉树.html#其他语言版本
二叉树最大深度题
https://leetcode.cn/problems/maximum-depth-of-binary-tree/
二叉树最大深度代码随想录
https://programmercarl.com/0104.二叉树的最大深度.html
二叉树最小深度题
https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/
二叉树最小深度代码随想录
https://programmercarl.com/0111.二叉树的最小深度.html

翻转二叉树

题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

重点

  • 递归法:正常模拟
  • 迭代法:栈前序遍历交换 在node处理时 交换
  • 层序遍历法:每个node交换子节点

题解代码

递归法

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
        left = self.invertTree(root.left)
        right = self.invertTree(root.right)
        root.right = left
        root.left = right
        return root

统一迭代法

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        st = []
        res = []
        if not root:
            return root
        else:
            st.append(root)
        while st:
            node = st.pop()
            if node:
                if node.right:
                    st.append(node.right)
                if node.left:
                    st.append(node.left)
                st.append(node)
                st.append(None)
            else:
                node = st.pop()
                node.right,node.left = node.left,node.right
        return root

层序遍历法

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        queue = collections.deque()
        res = []
        if not root:
            return root
        else:
            queue.append(root)
        while queue:
            for i in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                node.right,node.left = node.left,node.right
        return root

对称二叉树

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

重点

  • 不是左右子节点完全相同;
  • 递归法:compare函数 判断外侧和内侧是否相同;
  • 迭代法:遍历:左右-右左;左左-右右;两组分别对比;
  • 层序遍历法:1.个数为2的倍数 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        else:
            return self.compare(root.right,root.left)

    def compare(self,right,left):
        if not right and left: return False
        elif not left and right: return False
        elif not right and not left: return True
        elif right.val != left.val: return False

        outside = self.compare(right.right,left.left)
        inside = self.compare(right.left,left.right)
        return outside and inside

迭代法——队列

# 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 not root:
            return True
        que = collections.deque()
        que.append(root.left)
        que.append(root.right)
        while que:
            left = que.popleft()
            right = que.popleft()
            if left and not right:
                return False
            elif right and not left:
                return False
            elif not right and not left:
                continue
            elif right.val!=left.val:
                return False
            que.append(left.right)
            que.append(right.left)
            que.append(right.right)
            que.append(left.left)
        return 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        st = []
        st.append(root.left)
        st.append(root.right)
        while st:
            left = st.pop()
            right = st.pop()
            if left and not right:
                return False
            elif right and not left:
                return False
            elif not right and not left:
                continue
            elif right.val!=left.val:
                return False
            st.append(left.right)
            st.append(right.left)
            st.append(right.right)
            st.append(left.left)
        return 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        que = collections.deque([root.left,root.right])
        while que:
            if len(que)%2!=0:
                return False

            line = []
            for i in range(len(que)):
                node = que.popleft()
                if node:
                    line.append(node.val)
                    que.append(node.left)
                    que.append(node.right)
                else:
                    line.append(None)
            if line!=line[::-1]:
                return False
        return True

二叉树最大深度

题目

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

重点

  • 层序遍历法:所有层数的长度;
  • 递归法:如果有子节点,选最大的即可

题解代码

递归法

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        else:
            return 1+max(self.maxDepth(root.left),self.maxDepth(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 maxDepth(self, root: Optional[TreeNode]) -> int:
        queue = collections.deque()
        res = []
        if not root:
            return len(res)
        else:
            queue.append(root)
        while queue:
            line = []
            for i in range(len(queue)):
                node = queue.popleft()
                line.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(line)
        return len(res)

111. 二叉树的最小深度

题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

重点

  • 递归法:不能直接用min,需要考虑子节点为空节点的情况
  • 层序遍历法 :记录叶子节点的深度+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 minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        elif not root.right or not root.left:
            return 1+max(self.minDepth(root.right),self.minDepth(root.left))
        else:
            return 1+min(self.minDepth(root.right),self.minDepth(root.left))

层序遍历法

# 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 minDepth(self, root: Optional[TreeNode]) -> int:
        queue = collections.deque()
        res = []
        if not root:
            return len(res)
        else:
            queue.append(root)

        while queue:
            line = []
            for i in range(len(queue)):
                node = queue.popleft()
                line.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                if (not node.right) and (not node.left):
                    return len(res)+1
            res.append(line)

标签:node,right,15,训练营,随想录,return,root,self,left
From: https://www.cnblogs.com/P201821440041/p/18251972

相关文章

  • 代码随想录算法训练营第39天 | 62.不同路径 、63. 不同路径 II
    今天开始逐渐有dp的感觉了,前两题不同路径,可以好好研究一下,适合进阶详细布置62.不同路径本题大家掌握动态规划的方法就可以。数论方法有点非主流,很难想到。https://programmercarl.com/0062.不同路径.html视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/***@p......
  • C语言笔记第15篇:文件操作
    1、为什么使用文件?如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。2、什么是文件?磁盘(硬盘)上的文件就是文件。但是程序设计中,我们一般谈两个文......
  • HNUCM-2024年春季学期《算法分析与设计》练习15
    问题A:简单递归求和题目描述使用递归编写一个程序求如下表达式前n项的计算结果: (n<=100)1- 3+5-7+9-11+......输入n,输出表达式的计算结果。输入多组输入,每组输入一个n,n<=100。输出输出表达式的计算结果。样例输入 Copy12样例输出 Copy......
  • [240615] X-CMD 发布 v0.3.11,增加对 elvish 的支持
    目录X-CMD发布v0.3.11,增加对elvish的支持,并优化对nushell,fish,xonsh,tcsh的支持✨co模块-copilot✨elv模块✨hubX-CMD发布v0.3.11,增加对elvish的支持,并优化对nushell,fish,xonsh,tcsh的支持✨co模块-copilot新增功能:现在可以在--co|,子命......
  • 代码随想录算法训练营第36期 last day
    最后一次更新,之后去复习专业课和简历583两个字符串的删除操作自己做出来了:Code:class Solution {public://找到公共子序列的最大长度dp 最小步数=串1.size-dp+串2.size-dp    int minDistance(string word1, string word2) {        vector<vector<int......
  • BUUCTF-Misc(151-160)
    [DDCTF2018]第四扩展FSbinwalk提取一下然后提取出来一个加密压缩包,密码就在图片的备注里Pactera提取出来是一个文本字频统计得到flagflag{huanwe1sik4o!}Beautiful_Side010editor打开,发现一个png文件,我们提取出来发现是半张二维码然后打开QRazyBox-QRCodeAnal......
  • 3.15
    所花时间:4h代码量:430博客量:1了解的知识点:1.Android连接Mysql数据库教程以及增删改查_android访问mysql增删查改源码-CSDN博客更新数据第一步,修改activity_main.xml文件(添加一个更新按钮和输入框)<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="ht......
  • 2024/6/15 一场模拟赛
    共9个题目,前五个是绿及以下,后四个是蓝紫。先开A,唉怎么不是很签到?写了个数据结构,大概就是对每个点开二叉,然后发现自己根本TM写不动,又去想别的做法,越想越唐,看着别的人都切了,急了,回去看了看题,发现尼玛这玩意是砍完之后查询,不是砍一次查询一次,5min切了。看B,什么唐氏东西,也没......
  • 6.15
    今日学习总结学习时间2hpackagecom.app.chapter04;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;import......
  • 代码随想录刷题记录(7)| 字符串(344.反转字符串,541. 反转字符串II,卡码网:54.替换数字)
    目录(一)反转字符串1.题目描述2.思路3.解题过程(二)反转字符串Ⅱ1.题目描述2.思路3.解题过程(三)替换数字1.题目描述2.思路3.解题过程(一)反转字符串344.反转字符串-力扣(LeetCode)1.题目描述        编写一个函数,其作用是将输入的字符串反转过......