代码随想录算法训练营第十二天 | 二叉树系列3

news2024/11/16 2:37:18

二叉树系列3

  • 二叉树 看到二叉树就想到递归
  • 404 左叶子之和
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 513 找树左下角的值
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 112 路径总和
    • 未看讲解,自己编写的青春稚嫩版
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 113 路径总和2
    • 未看解答前自己编写
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 106 从中序与后序遍历序列构造二叉树
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 105 从前序与中序遍历序列构造二叉树
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 654 最大二叉树
    • 重点
    • 代码随想录的代码
    • 我的代码(当日晚上自己理解后写)
  • 二叉树系列3总结

二叉树 看到二叉树就想到递归

404 左叶子之和

不会,单次递归中的处理逻辑没想清楚。

重点

首先要理清左叶子节点的定义,即当前节点是其父节点的左孩子,并且当前节点的左右孩子均为None。

其次在理清递归逻辑时注意,在我们的定义中,每个节点收集的是其左右子树的左叶子之和,所以当遍历至叶子节点时,return 0

遍历顺序:使用后序遍历,同样是从底向上收集信息的,后序遍历写的代码较为简洁。

左递归后的,if 条件判断赋值,是整个代码的关键,画个图就能理解,意义为:子树为[9 6 7],那么对于9这个节点,左叶子之和就为6 。这里的内容是:确定单层递归逻辑里。

解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。

代码随想录的代码

递归法:

class Solution:
    def sumOfLeftLeaves(self, root):
        if root is None:
            return 0
        if root.left is None and root.right is None:
            return 0
        
        leftValue = self.sumOfLeftLeaves(root.left)  # 左
        if root.left and not root.left.left and not root.left.right:  # 左子树是左叶子的情况
            leftValue = root.left.val
            
        rightValue = self.sumOfLeftLeaves(root.right)  # 右

        sum_val = leftValue + rightValue  # 中
        return sum_val

迭代法(前序遍历,中左右,思路上很直接,按照定义,统计所有的左孩子即可)

class Solution:
    def sumOfLeftLeaves(self, root):
        if root is None:
            return 0
        st = [root]
        result = 0
        while st:
            node = st.pop()
            if node.left and node.left.left is None and node.left.right is None:
                result += node.left.val
            if node.right:
                st.append(node.right)
            if node.left:
                st.append(node.left)
        return result

我的代码(当日晚上自己理解后写)

513 找树左下角的值

不会,用层序遍历很简单啊,为什么没想到,用层序遍历!!!

同样,递归法也要学习,这里的递归也要用回溯。

重点

首先是遍历顺序,只要保证,先遍历左节点就可以了,前中后序(中左右,左中右,左右中,左均在右前,所以什么顺序都可以),所以在递归中,用前序遍历。

代码随想录的代码

递归+回溯

class Solution:
    def findBottomLeftValue(self, root: TreeNode) -> int:
        self.max_depth = float('-inf')
        self.result = None
        self.traversal(root, 0)
        return self.result
    
    def traversal(self, node, depth):
        if not node.left and not node.right:
            if depth > self.max_depth:
                self.max_depth = depth
                self.result = node.val
            return
        
        if node.left:
            depth += 1
            self.traversal(node.left, depth)
            depth -= 1
        if node.right:
            depth += 1
            self.traversal(node.right, depth)
            depth -= 1

递归+隐式回溯

class Solution:
    def findBottomLeftValue(self, root: TreeNode) -> int:
        self.max_depth = float('-inf')
        self.result = None
        self.traversal(root, 0)
        return self.result
    
    def traversal(self, node, depth):
        if not node.left and not node.right:
            if depth > self.max_depth:
                self.max_depth = depth
                self.result = node.val
            return
        
        if node.left:
            self.traversal(node.left, depth+1)
        if node.right:
            self.traversal(node.right, depth+1)

层序遍历:

from collections import deque
class Solution:
    def findBottomLeftValue(self, root):
        if root is None:
            return 0
        queue = deque()
        queue.append(root)
        result = 0
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.popleft()
                if i == 0:
                    result = node.val
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return result

我的代码(当日晚上自己理解后写)

112 路径总和

未看讲解,自己编写的青春稚嫩版

class Solution:
    def __init__(self):
        self.bool = False

    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        res = 0
        if root == None:
            return False
        self.digui(root,targetSum,res)
        return self.bool


    def digui(self,root,target,res):
        if not self.bool :
            if root.left == None and root.right == None :
                res += root.val
                if res == target :
                    self.bool = True
                    return
                else :
                    return
            if root.left :
                res += root.val
                leftbool = self.digui(root.left,target,res)
                res -= root.val
            if root.right :
                res += root.val
                rightbool = self.digui(root.right,target,res)
                res -= root.val 
            
            return
        else :
            return 

重点

借助本题,要学习,递归算法,什么时候需要返回值,什么时候不需要返回值?

本题同样不需要对中间节点进行处理逻辑,所以前中后序遍历均可。

在这里插入图片描述

本题是需要返回值的,还是要学习代码随想录的代码,及时返回,避免无效递归,比如在 if root.left 后,不仅要进一步递归,还要判断一下,是否return True 。

本题还有另一种方法,迭代法,要学习,用栈模拟需要回溯的递归过程。

代码随想录的代码

递归

class Solution:
    def traversal(self, cur: TreeNode, count: int) -> bool:
        if not cur.left and not cur.right and count == 0: # 遇到叶子节点,并且计数为0
            return True
        if not cur.left and not cur.right: # 遇到叶子节点直接返回
            return False
        
        if cur.left: # 左
            count -= cur.left.val
            if self.traversal(cur.left, count): # 递归,处理节点
                return True
            count += cur.left.val # 回溯,撤销处理结果
            
        if cur.right: # 右
            count -= cur.right.val
            if self.traversal(cur.right, count): # 递归,处理节点
                return True
            count += cur.right.val # 回溯,撤销处理结果
            
        return False
    
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        if root is None:
            return False
        return self.traversal(root, sum - root.val) 

递归+精简

class Solution:
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        if not root:
            return False
        if not root.left and not root.right and sum == root.val:
            return True
        return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)

迭代法

class Solution:
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        if not root:
            return False
        # 此时栈里要放的是pair<节点指针,路径数值>
        st = [(root, root.val)]
        while st:
            node, path_sum = st.pop()
            # 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true
            if not node.left and not node.right and path_sum == sum:
                return True
            # 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来
            if node.right:
                st.append((node.right, path_sum + node.right.val))
            # 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来
            if node.left:
                st.append((node.left, path_sum + node.left.val))
        return False

我的代码(当日晚上自己理解后写)

113 路径总和2

未看解答前自己编写

Debug心得 :主要有两点

1:在获得正确路径后,res要进行一步pop,回溯,因为前面有append操作.

2:Python中,res被append进到level后,如果对res操作,level的值也会改变!离谱!
例如: res = [1,2] r = [] r.append(res) res.pop() 此时,r 中为 [ [1 ] ] ,所以要 r.append(res.copy())

class Solution:
    def __init__(self):
        self.level = []
    def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        if root == None :
            return []
        
        res = []
        
        self.digui(root,targetSum,res,self.level)
        return self.level

    def digui(self,root,target,res,level):
        
        if root.left == None and root.right == None :
            target -= root.val
            if target == 0 :
                res.append(root.val)
                self.level.append(res.copy())
                res.pop()

            return 
                
           
        if root.left :
            target -= root.val
            res.append(root.val)
            self.digui(root.left,target,res,self.level)
            target += root.val
            res.pop()
        if root.right :
            target -= root.val
            res.append(root.val)
            self.digui(root.right,target,res,self.level)
            target += root.val
            res.pop()
            
        return

此题不需要引入全局变量

class Solution:
    
    def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        if root == None :
            return []
        level = []
        res = []
        
        self.digui(root,targetSum,res,level)
        return level

    def digui(self,root,target,res,level):
        
        if root.left == None and root.right == None :
            target -= root.val
            if target == 0 :
                res.append(root.val)
                level.append(res.copy())
                res.pop()

            return 
                
           
        if root.left :
            target -= root.val
            res.append(root.val)
            self.digui(root.left,target,res,level)
            target += root.val
            res.pop()
        if root.right :
            target -= root.val
            res.append(root.val)
            self.digui(root.right,target,res,level)
            target += root.val
            res.pop()
            
        return

重点

此题与上一题的不同之处在于:对于返回值的处理上,不需要返回值,设置一个变量,保存所有正确的路径。

代码随想录的代码

递归

class Solution:
    def __init__(self):
        self.result = []
        self.path = []

    def traversal(self, cur, count):
        if not cur.left and not cur.right and count == 0: # 遇到了叶子节点且找到了和为sum的路径
            self.result.append(self.path[:])
            return

        if not cur.left and not cur.right: # 遇到叶子节点而没有找到合适的边,直接返回
            return

        if cur.left: # 左 (空节点不遍历)
            self.path.append(cur.left.val)
            count -= cur.left.val
            self.traversal(cur.left, count) # 递归
            count += cur.left.val # 回溯
            self.path.pop() # 回溯

        if cur.right: #  右 (空节点不遍历)
            self.path.append(cur.right.val) 
            count -= cur.right.val
            self.traversal(cur.right, count) # 递归
            count += cur.right.val # 回溯
            self.path.pop() # 回溯

        return

    def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
        self.result.clear()
        self.path.clear()
        if not root:
            return self.result
        self.path.append(root.val) # 把根节点放进路径
        self.traversal(root, sum - root.val)
        return self.result 

递归+精简

class Solution:
    def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]:
        
        result = []
        self.traversal(root, targetSum, [], result)
        return result
    def traversal(self,node, count, path, result):
            if not node:
                return
            path.append(node.val)
            count -= node.val
            if not node.left and not node.right and count == 0:
                result.append(list(path))
            self.traversal(node.left, count, path, result)
            self.traversal(node.right, count, path, result)
            path.pop()

迭代:

class Solution:
    def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]:
        if not root:
            return []
        stack = [(root, [root.val])]
        res = []
        while stack:
            node, path = stack.pop()
            if not node.left and not node.right and sum(path) == targetSum:
                res.append(path)
            if node.right:
                stack.append((node.right, path + [node.right.val]))
            if node.left:
                stack.append((node.left, path + [node.left.val]))
        return res

我的代码(当日晚上自己理解后写)

106 从中序与后序遍历序列构造二叉树

中序和后序、中序和前序,可以唯一的确定一颗二叉树的前提是:中序和后序(前序),序列里面的值是不重复的,有重复不可能切割。

前序和后序无法确定,因为不知道中间节点。

利用递归构建,利用后序的最后一个节点,来确定根节点,根据根节点来切中序,根据切出的左子树的长度N,取后序中的前N个,即可成功切割后序数组,中序和后序均切割完后,递归构建即可。

本题在切割区间时,要始终注意不变量,采取全部左闭右开。

凡是构造二叉树的题目,采用的遍历顺序均为前序遍历。

重点

涉及非常多的细节!

代码随想录的代码

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        # 第一步: 特殊情况讨论: 树为空. (递归终止条件)
        if not postorder:
            return None

        # 第二步: 后序遍历的最后一个就是当前的中间节点.
        root_val = postorder[-1]
        root = TreeNode(root_val)

        # 第三步: 找切割点.
        separator_idx = inorder.index(root_val)

        # 第四步: 切割inorder数组. 得到inorder数组的左,右半边.
        inorder_left = inorder[:separator_idx]
        inorder_right = inorder[separator_idx + 1:]

        # 第五步: 切割postorder数组. 得到postorder数组的左,右半边.
        # ⭐️ 重点1: 中序数组大小一定跟后序数组大小是相同的.
        postorder_left = postorder[:len(inorder_left)]
        postorder_right = postorder[len(inorder_left): len(postorder) - 1]

        # 第六步: 递归
        root.left = self.buildTree(inorder_left, postorder_left)
        root.right = self.buildTree(inorder_right, postorder_right)
         # 第七步: 返回答案
        return root

我的代码(当日晚上自己理解后写)

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

同上一题,106. 凡是构造二叉树的题目,采用的遍历顺序均为前序遍历。

重点

细节!

代码随想录的代码

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        # 第一步: 特殊情况讨论: 树为空. 或者说是递归终止条件
        if not preorder:
            return None

        # 第二步: 前序遍历的第一个就是当前的中间节点.
        root_val = preorder[0]
        root = TreeNode(root_val)

        # 第三步: 找切割点.
        separator_idx = inorder.index(root_val)

        # 第四步: 切割inorder数组. 得到inorder数组的左,右半边.
        inorder_left = inorder[:separator_idx]
        inorder_right = inorder[separator_idx + 1:]

        # 第五步: 切割preorder数组. 得到preorder数组的左,右半边.
        # ⭐️ 重点1: 中序数组大小一定跟前序数组大小是相同的.
        preorder_left = preorder[1:1 + len(inorder_left)]
        preorder_right = preorder[1 + len(inorder_left):]

        # 第六步: 递归
        root.left = self.buildTree(preorder_left, inorder_left)
        root.right = self.buildTree(preorder_right, inorder_right)
        # 第七步: 返回答案
        return root

我的代码(当日晚上自己理解后写)

654 最大二叉树

凡是构造二叉树的题目,采用的遍历顺序均为前序遍历。

本题一眼看上去也是使用递归构建树的题。

重点

本题学习代码随想录解答文章中的优化版本,当 left > right 时,return None

代码随想录的代码

版本一(基础版)

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        if len(nums) == 1:
            return TreeNode(nums[0])
        node = TreeNode(0)
        # 找到数组中最大的值和对应的下标
        maxValue = 0
        maxValueIndex = 0
        for i in range(len(nums)):
            if nums[i] > maxValue:
                maxValue = nums[i]
                maxValueIndex = i
        node.val = maxValue
        # 最大值所在的下标左区间 构造左子树
        if maxValueIndex > 0:
            new_list = nums[:maxValueIndex]
            node.left = self.constructMaximumBinaryTree(new_list)
        # 最大值所在的下标右区间 构造右子树
        if maxValueIndex < len(nums) - 1:
            new_list = nums[maxValueIndex+1:]
            node.right = self.constructMaximumBinaryTree(new_list)
        return node
        

版本二(使用下标)

class Solution:
    def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
        if left >= right:
            return None
        maxValueIndex = left
        for i in range(left + 1, right):
            if nums[i] > nums[maxValueIndex]:
                maxValueIndex = i
        root = TreeNode(nums[maxValueIndex])
        root.left = self.traversal(nums, left, maxValueIndex)
        root.right = self.traversal(nums, maxValueIndex + 1, right)
        return root

    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        return self.traversal(nums, 0, len(nums))

版本三(使用切片)

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        if not nums:
            return None
        max_val = max(nums)
        max_index = nums.index(max_val)
        node = TreeNode(max_val)
        node.left = self.constructMaximumBinaryTree(nums[:max_index])
        node.right = self.constructMaximumBinaryTree(nums[max_index+1:])
        return node

我的代码(当日晚上自己理解后写)

二叉树系列3总结

代码随想录的总结很不错,直接上链接。

二叉树系列3总结

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

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

相关文章

加解密简单了解之DH密钥协商与AES128

加解密简单了解 1、对称加密与非对称加密 对称加密概念&#xff1a;加密算法是公开的&#xff0c;靠的是秘钥来加密数据&#xff0c;使用一个秘钥加密&#xff0c;必须使用相同的秘钥才解密。 优点&#xff1a; 算法公开、计算量小、加密速度快、加密效率高 缺点&#xff1a;…

通信算法之171: LTE 不同带宽参数

转载&#xff1a; LTE不同带宽配置下的对应的采样率&#xff1a; < Sampling Time > 20 Mhz BW Case : Ts 1 sec / 30.72 Mhz 1s/30,720,000 Hz 0.0326 us 32.6 ns 15 Mhz BW Case : T15 sec / 23.04 Mhz 1s/23,040,000 Hz 0.0434 us 43.4 ns 10 Mhz BW Case :…

【数据结构二叉树OJ系列】2、单值二叉树

目录 题述&#xff08;力扣难度&#xff1a;简单&#xff09;&#xff1a; 思路&#xff1a; 正确的代码&#xff1a; 题述&#xff08;力扣难度&#xff1a;简单&#xff09;&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有…

macOS Sonoma 14beta 3(23A5286g)发布(附黑/白苹果镜像地址)

系统镜像下载&#xff1a;百度&#xff1a;黑果魏叔 系统介绍 黑果魏叔 7 月 6 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新&#xff08;内部版本号&#xff1a;23A5286g&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 小…

进程通信 软中断 signal()解读

目录 进程通信概述 软中断通信 signal() 概述 signal()类似的函数 signal()之SIGINT signal()之SIGTERM signal()之SIGALRM signal()之SIGQUIT SIG_IGN使用 进程通信概述 进程通信是指进程之间的信息交换。 通信的主要方式 在操作系统中&#xff0c;进程之间需要…

EtherCAT转TCP/IP网关ethercat最大通讯距离

天啊&#xff01;你们听说了吗&#xff1f;数据互联互通问题终于迎来了突破性进展&#xff01;作为生产管理系统的关键部分&#xff0c;数据互联互通一直是个大问题。然而&#xff0c;ETHERCAT和TCP/IP是两个不同的协议&#xff0c;它们之间的通讯一直是个大 问题。但是&#x…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(十)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

【Linux之拿捏信号1】什么是信号以及信号的产生

文章目录 生活角度的信号技术应用角度的信号系统中的信号信号函数signal调用系统函数向进程发信号由软件条件产生信号由硬件异常产生信号总结 生活角度的信号 在我们的生活中&#xff0c;什么可以被称为信号呢&#xff1f; 那可太多啦&#xff0c;有红绿灯&#xff0c;闹钟&…

通过NFS与Windows共享文件

通过NFS与Windows共享文件 1. 连接同一wifi网络 将开发板子连接至和PC同网络&#xff0c;并保证能互相ping通 2.启动Windows 端NFS Server 在电脑端启动NFS server&#xff08;下载链接&#xff1a; https://www.hanewin.net/nfs-e.htm &#xff09; 3. 双击nfssrv-64.exe…

轻创数字人集团一文论述如何助力中小型企业数字化转型 ?

随着互联网技术的不断发展&#xff0c;人工智能已经成为了许多企业数字化转型的重要工具。然而&#xff0c;在人工智能领域中&#xff0c;不乏一些大型公司在研发和应用方面占据着主导地位。例如&#xff0c;以基础技术和软硬件设施为主的上游层&#xff0c;以英伟达、Meta、Ep…

基于 DDR3 的native接口串口传图帧缓存系统设计实现(整体设计)

文章目录 前言一、串口传图顶层系统设计框图二、各模块说明三、uart_ddr3_native_tft四、 uart_ddr3_native_tft仿真模块五、fifo_ddr3_native_fifo 模块六、fifo_ddr3_native_fifo 仿真模块七、传图展示 前言 结合串口接收模块和 tft 显示屏控制模块&#xff0c;设计一个基于…

sklearn房价预测(随机森林)

文章目录 一、前言二、实现方法一、前言 任务目标:根据统计在csv中的房屋属性相关数据,预测房屋最终成交价格数据集:《住宅属性数据集》,自取https://download.csdn.net/download/weixin_43721000/87785277数据集字段解释: 这个文件中有字段详细说明↓ 二、实现方法 # pi…

ARM_key1按键按下,打印key1

include/key.h #ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h"//对RCC/GPIO/EXTI进行初始化 void hal_key1_exit_init()…

路径规划算法:基于类电磁机制优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于类电磁机制优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于类电磁机制优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

面试交流会

面试交流 目录&#xff1a; 01&#xff1a;关于人生目标 02&#xff1a;关于心态 03&#xff1a;关于选择 04&#xff1a;关于学习 05&#xff1a;关于简历 06&#xff1a;关于找工作 1&#xff1a;关于人生目标 1.01、自己想成为什么样的人&#xff1f; 1.02、自己的人生目标是…

sqoop 详解

1 sqoop原理 1.1 sqoop介绍# Sqoop是Apache旗下的一款“hadoop和关系型数据库服务器之间传送数据”的工具。   导入数据&#xff1a;MySQL、Oracle导入数据到hadoop的hdfs、hive、hbase等数据存储系统。   导出数据&#xff1a;从hadoop的文件系统中导出数据到关系型数据…

Mysql数据库——表操作的练习

题目一 &#xff08;1&#xff09; mysql> create database Market; &#xff08;2&#xff09; mysql> use Market; Database changed mysql> create table customers(->c_num INT(11) primary key auto_increment,->c_name varchar(50),->c_contact varcha…

chatGPT之100个例子-从体验到精通

简介 本博文演示了100个chatGPT在各行各业的使用例子,全部看完有助于培养chatGPT解决问题的思维。 在人工智能时代,智能软件并不会淘汰人类,淘汰人类的是会使用人工智能的人! 我们直接使用openAI官方chatGPT,生动演示了chatGPT的一些妙用! 请仔细看完,一定会有收获! 每…

Python 之 基本概述

这里写目录标题 一、Python 简介1. 历史背景2. 特点3. 优缺点4. 应用领域 二、Python 解释器1. 解释器是什么&#xff1f;2. 解释器的构成及其各部分功能3. 解释器的执行过程 三、Python 环境安装四、第一个 Python 程序1. 实际操作2. 常见问题 五、Python 开发环境 一、Python…

Ubuntu 22.04.2 LTS 安装搜狗输入法后,修改区域格式Regional Format crash 崩溃 ,改用bash 指令修改

故障 系统已经升级到最新 基于Ubuntu 20.04 LTS apt upgrade升级而来。 yeqiangyeqiang-MS-7B23:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.2 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.2 LTS (Jammy Jellyfish)"…