【Python 數據結構 10.二叉樹】

目錄

一、二叉樹的基本概念

1.二叉樹的定義

2.二叉樹的特點

3.特殊的二叉樹

Ⅰ、斜樹

Ⅱ、滿二叉樹

Ⅲ、完全二叉樹

Ⅳ、完全二叉樹和滿二叉樹的區別

4.二叉樹的性質

5.二叉樹的順序存儲

Ⅰ、完全二叉樹

Ⅱ、非完全二叉樹

Ⅲ、稀疏二叉樹

6.二叉樹的鏈式存儲

7.二叉樹的遍歷概念

8.二叉樹的前序遍歷

9.二叉樹的中序遍歷

10.二叉樹的后序遍歷

11.二叉樹的層序遍歷

二、Python中的二叉樹

1.樹的結點定義

2.樹的定義

Ⅰ、初始化

Ⅱ、根據給定的結點ID從樹結構中獲取對應的結點

Ⅲ、訪問函數,打印元素結點值

Ⅳ、根據數組創建二叉樹

Ⅴ、先序遍歷

Ⅵ、中序遍歷

Ⅶ、后序遍歷

三、實戰

1.144. 二叉樹的前序遍歷

方法一 遞歸

思路與算法

?編輯

方法二 用棧 Stack 實現迭代遍歷

思路與算法

2.94. 二叉樹的中序遍歷

方法一 遞歸

思路與算法

方法二 用棧實現迭代?

思路與算法

3.145. 二叉樹的后序遍歷

方法一 遞歸

思路與算法

方法二 用棧實現迭代?

思路與算法


等你讀懂了相遇的意義,有了隔閡別放棄

????????????????????????????????????????????????????????—— 25.3.8

一、二叉樹的基本概念

1.二叉樹的定義

? ? ? ? 二叉樹是 n(n ≥ 0) 個結點組成的有限集合,這個集合要么是空集(當 n 等于 0 時),要么是由一個根節點和兩棵互不相交的二叉樹組成,其中這兩棵互不相交的二叉樹被稱為根節點的左子樹和右子樹

? ? ? ? 如圖所示,2 是 1 的左子樹,3 是 1 的右子樹;同時,4 和 5 分別是 2 的左右子樹,6 和 7分別是 3 的左右子樹


2.二叉樹的特點

????????二叉樹是一種樹,它有如下幾個特征:

????????① 每個結點最多二棵子樹,即每個結點的孩子結點個數為 0、1、2.

? ? ? ? ② 這兩棵子樹是有順序的,分別叫:左子樹 和 右子樹,就像左手和右手一樣,是不能顛倒
的。

? ? ? ? ③ 如果只有一棵子樹的情況,也需要區分順序,如圖所示:

b 是 a 的左子樹? ? ? ? ?c 是 a 的右子樹


3.特殊的二叉樹

Ⅰ、斜樹

????????所有結點都只有左子樹的二叉樹,被稱為左斜樹

? ? ? ? 所有結點都只有右子樹的二叉樹,被稱為右斜樹

? ? ? ? 斜樹有點類似 線性表,所以線性表可以理解為一種特殊形式的樹


Ⅱ、滿二叉樹

? ? ? ? 對于一棵二叉樹,如果它的所有根結點和內部結點都存在左右子樹,且所有葉子結點都在同一層,這樣的樹就是滿二叉樹

滿二叉樹有如下幾個特點

? ? ? ? ① 葉子節點一定在最后一層

? ? ? ? ② 非葉子結點的度為 2

? ? ? ? ③ 深度相同的二叉樹中,滿二叉樹的結點個數最多,為 2 ^ h - 1(其中 h 代表樹的深度)


Ⅲ、完全二叉樹

? ? ? ? 對一顆具有 n 個結點的二叉樹,按照層序進行編號,如果編號 i 的結點 和 同樣深度的滿二叉樹中的編號 i 的結點在二叉樹中,位置完全相同則被稱為 完全二叉樹


Ⅳ、完全二叉樹和滿二叉樹的區別

????????滿二叉樹一定是完全二叉樹,而完全二叉樹則不一定是滿二叉樹,完全二叉樹有如下幾個特
點:

? ? ? ? ① 葉子結點只能出現在最下面兩層

? ? ? ? ② 最下層的葉子結點,一定是集中在左邊的連續位置,倒數第二層如果有葉子結點一定集中在右邊的連續位置

????????③ 如果某個結點度為 1,則只有左子樹,即 不存在只有右子樹 的情況

? ? ? ? ④ 同樣結點數的二叉樹,完全二叉樹的深度最小

????????如下圖所示,就不是一棵完全二叉樹,因為5號結點沒有右子樹,但是6號結點是有左子樹的,不滿足上述第 2 點。


4.二叉樹的性質

? ? ? ? ① 二叉樹的第 i (i >= 1) 層上最多 2 ^ (i - 1) 個結點;

? ? ? ? ② 深度為 h 的二叉樹至多 2 ^ h - 1 個結點;

? ? ? ? ③ n個結點的完全二叉樹的深度為 floor(log2n) + 1(其中 floor(x) 代表對 x 取下整);


5.二叉樹的順序存儲

? ? ? ? 二叉樹的順序存儲就是指:利用順序表對二叉樹進行存儲。結點的存儲位置即順序表的索引,能夠體現結點之間的邏輯關系比如父結點和孩子結點之間的關系,左右兄弟結點之間的關系 等。

Ⅰ、完全二叉樹

? ? ? ? 編號代表了順序表索引的絕對位置,映射后如下:

? ? ? ? 為了方便,將順序表索引為 0 的位置留空

? ? ? ? 當知道某個結點在順序表中的索引 x,就可以知道它左右兒子的索引分別為 2x 和 2x + 1.反之,當知道某個結點的索引 x,也能知道其父節點的索引為 floor(x / 2)


Ⅱ、非完全二叉樹

? ? ? ? 對于非完全二叉樹,只需要將對應不存在的結點設置為空即可

? ? ? ? 編號代表了順序表索引的絕對位置,映射后如下:


Ⅲ、稀疏二叉樹

? ? ? ? 對于較為稀疏的二叉樹,就會有如下情況出現,這時候如果用這種方式進行存儲,就比較浪費內存了

????????編號代表了順序表索引的絕對位置,映射后如下:

? ? ? ? 這種情況下,為了提升內存利用率,我們可以采用鏈表進行存儲


6.二叉樹的鏈式存儲

? ? ? ? 二叉樹每個結點至多有兩個孩子結點,所以對于每個結點設置一個數據域(data)?和 兩個指針域(left?和 right) 即可。指針域 分別指向 左孩子結點 和 右孩子結點。


7.二叉樹的遍歷概念

????????二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中的所有結點,使得每個結點訪問一次且僅被訪問一次。

????????對于線性表的遍歷,要么從頭到尾,要么從尾到頭,遍歷方式較為單純。但是樹不一樣,它的每個結點都有可能有兩個孩子結點,所以遍歷的順序面臨著不同的選擇。

????????二叉樹的常用遍歷方法,有以下四種:前序遍歷、中序遍歷、后序遍歷、層序遍歷。

????????編號代表了順序表索引的絕對位置,映射后如下:


8.二叉樹的前序遍歷

????????如果二叉樹為空則直接返回,否則先訪問根結點,再遞歸前序遍歷左子樹,再遞歸前序遍歷右子樹(根、左、右)前序遍歷的結果如下:a、b、d、g、h、c、e、f、i


9.二叉樹的中序遍歷

????????如果二叉樹為空則直接返回,否則先遞歸中序遍歷左子樹,再訪問根結點,再遞歸中序遍歷右子樹(左、根、右)中序遍歷的結果如下:g、d、h、b、a、e、c、i、f


10.二叉樹的后序遍歷

????????如果二叉樹為空則直接返回,否則先遞歸后遍歷左子樹,再遞歸后序遍歷右子樹,再訪問根結點(左、右、根)后序遍歷的結果如下:g、h、d、b、e、i、f、c、a


11.二叉樹的層序遍歷

????????如果二叉樹為空直接返回,否則依次從樹的第一層開始,從上至下逐層遍歷,在同一層中,按從左到右的順序對結點逐個訪問。圖中二叉樹層序遍歷的結果為:a、b、c、d、e、f、g、h、i


二、Python中的二叉樹

1.樹的結點定義

val:存放當前結點的value值

left:存放當前節點的左孩子

right:存放當前節點的右孩子?

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right

2.樹的定義

Ⅰ、初始化

接收參數 maxNodes,傳入結點最大數目

列表推導式:

class Tree:def __init__(self, maxNodes):self.root = Noneself.nodes = [TreeNode() for i in range(maxNodes)]self.nodeSize = maxNodes

Ⅱ、根據給定的結點ID從樹結構中獲取對應的結點

    # 根據給定的節點ID從樹結構中獲取對應的節點def GetTreeNode(self, id):return self.nodes[id]

Ⅲ、訪問函數,打印元素結點值

    # 訪問函數,打印元素結點的值def visit(self, node):print(node.val, end=' ')

Ⅳ、根據數組創建二叉樹

    # 傳入一個數組,根據數組創建二叉樹def Create(self, arr, size, nodeId):if nodeId >= size or arr[nodeId] == None:return NonenowNode = self.GetTreeNode(nodeId)nowNode.val = arr[nodeId]nowNode.left = self.Create(arr, size, 2 * nodeId)nowNode.right = self.Create(arr, size, 2 * nodeId + 1)return nowNode

Ⅴ、先序遍歷

    # 先序遍歷def PreOrder(self, node):if node != None:self.visit(node)self.PreOrder(node.left)self.PreOrder(node.right)def preOrderTraversal(self):self.PreOrder(self.root)print('')

Ⅵ、中序遍歷

    # 中序遍歷def InOrder(self, node):if node != None:self.InOrder(node.left)self.visit(node)self.InOrder(node.right)def InOrderTraversal(self):self.InOrder(self.root)print('')

Ⅶ、后序遍歷

    # 后序遍歷def PostOrder(self, node):if node != None:self.PostOrder(node.left)self.PostOrder(node.right)self.visit(node)def PostTraversal(self):self.PostOrder(self.root)print('')

Ⅷ、測試代碼?

def Test():arr = [None, 'a', 'b', 'c', 'd', None, 'e', 'f', 'g', 'h', None, None, None, None, 'i']tree = Tree(len(arr))tree.CreateTree(arr)tree.preOrderTraversal()tree.InOrderTraversal()tree.PostTraversal()Test()


三、實戰

1.144. 二叉樹的前序遍歷

給你二叉樹的根節點?root?,返回它節點值的?前序?遍歷。

示例 1:

輸入:root = [1,null,2,3]

輸出:[1,2,3]

解釋:

示例 2:

輸入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

輸出:[1,2,4,5,6,7,3,8,9]

解釋:

示例 3:

輸入:root = []

輸出:[]

示例 4:

輸入:root = [1]

輸出:[1]

提示:

  • 樹中節點數目在范圍?[0, 100]?內
  • -100 <= Node.val <= 100

進階:遞歸算法很簡單,你可以通過迭代算法完成嗎?

方法一 遞歸

思路與算法
  • 前序遍歷遵循“根 -> 左 -> 右”的順序。
  • 遞歸函數?preorder?的核心邏輯是:
    1. 如果當前節點?root?不為空,則將其值加入結果列表?ret
    2. 遞歸遍歷左子樹。
    3. 遞歸遍歷右子樹。
  • 遞歸終止條件是當前節點為空(root is None),此時直接返回。
# 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 preorder(self, root:Optional[TreeNode], ret:List[int]):if root:ret.append(root.val)self.preorder(root.left, ret)self.preorder(root.right, ret)def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ret = []self.preorder(root, ret)return ret


方法二 用棧 Stack 實現迭代遍歷

思路與算法
  • 前序遍歷遵循“根 -> 左 -> 右”的順序。
  • 使用棧來模擬遞歸的過程:
    1. 從根節點開始,將當前節點的值加入結果列表?res,并將當前節點入棧。
    2. 遍歷左子樹,直到左子樹為空。
    3. 回溯到上一個節點(通過棧彈出),并遍歷其右子樹。
  • 重復上述過程,直到棧為空且當前節點為空。


2.94. 二叉樹的中序遍歷

給定一個二叉樹的根節點?root?,返回?它的?中序?遍歷?。

示例 1:

輸入:root = [1,null,2,3]
輸出:[1,3,2]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

提示:

  • 樹中節點數目在范圍?[0, 100]?內
  • -100 <= Node.val <= 100

進階:?遞歸算法很簡單,你可以通過迭代算法完成嗎?

方法一 遞歸

思路與算法
  • 后序遍歷遵循“左 -> 右 -> 根”的順序。
  • 遞歸函數?PostOrder?的核心邏輯是:
    1. 如果當前節點?root?不為空,則遞歸遍歷其左子樹。
    2. 遞歸遍歷其右子樹。
    3. 將當前節點的值加入結果列表?res
  • 遞歸終止條件是當前節點為空(root is None),此時直接返回。
# 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 PostOrder(self, root:Optional[TreeNode], res:List[int]):if root:self.PostOrder(root.left, res)self.PostOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.PostOrder(root, res)return res


方法二 用棧實現迭代?

思路與算法
  • 中序遍歷遵循“左 -> 根 -> 右”的順序。
  • 使用棧來模擬遞歸的過程:
    1. 從根節點開始,將當前節點入棧,并遍歷其左子樹,直到左子樹為空。
    2. 回溯到上一個節點(通過棧彈出),將其值加入結果列表?res
    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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res, stack = [], []while root or stack:if root:stack.append(root)root = root.leftelse:  root = stack.pop()res.append(root.val)root = root.rightreturn res

?


3.145. 二叉樹的后序遍歷

給你一棵二叉樹的根節點?root?,返回其節點值的?后序遍歷?

示例 1:

輸入:root = [1,null,2,3]

輸出:[3,2,1]

解釋:

示例 2:

輸入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

輸出:[4,6,7,5,2,9,8,3,1]

解釋:

示例 3:

輸入:root = []

輸出:[]

示例 4:

輸入:root = [1]

輸出:[1]

提示:

  • 樹中節點的數目在范圍?[0, 100]?內
  • -100 <= Node.val <= 100

進階:遞歸算法很簡單,你可以通過迭代算法完成嗎?

方法一 遞歸

思路與算法
  • 后序遍歷遵循“左 -> 右 -> 根”的順序。
  • 遞歸函數?postOrder?的核心邏輯是:
    1. 如果當前節點?root?不為空,則遞歸遍歷其左子樹。
    2. 遞歸遍歷其右子樹。
    3. 將當前節點的值加入結果列表?res
  • 遞歸終止條件是當前節點為空(root is None),此時直接返回。
# 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 postOrder(self, root:TreeNode, res):if root is None:returnself.postOrder(root.left, res)self.postOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.postOrder(root, res)return res


方法二 用棧實現迭代?

思路與算法
  • 后序遍歷遵循“左 -> 右 -> 根”的順序。
  • 使用棧來模擬遞歸的過程:
    1. 從根節點開始,將當前節點入棧,并遍歷其左子樹,直到左子樹為空。
    2. 如果左子樹為空,則遍歷其右子樹。
    3. 回溯到上一個節點(通過棧彈出),將其值加入結果列表?res
    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
class Solution:def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []stack = []node = rootwhile stack or node:while node:stack.append(node)if node.left != None:node = node.leftelse:node = node.rightnode = stack.pop()res.append(node.val)if stack and stack[-1].left == node:node = stack[-1].rightelse:node = Nonereturn res

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71743.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows 系統 Docker Desktop 入門教程:從零開始掌握容器化技術

文章目錄 前言一、Docker 簡介二、Docker Desktop 安裝2.1 系統要求2.2 安裝步驟 三、Docker 基本概念四、Docker 常用命令五、實戰&#xff1a;運行你的第一個容器5.1 拉取并運行 Nginx 容器5.2 查看容器日志5.3 停止并刪除容器 六、總結 前言 隨著云計算和微服務架構的普及&…

可變參數與遞歸

可變參數與遞歸 可變參數 package method; ? public class Demo03 {public static void main(String[] args) {Demo03 demo03new Demo03();demo03.test(1,2,3);?}public void test (int... i){System.out.println(i[0]);//1System.out.println(i[1]);//2System.out.println(…

【redis】全局命令exists、del、expire、ttl(惰性刪除和定期刪除)

exists——判定 key 是否存在 語法&#xff1a; exists key [key...] # 返回值&#xff1a;key 存在的個數針對多個 key 來說&#xff0c;是非常有用的時間復雜度 O ( 1 ) O(1) O(1) Redis 組織這些 key 就是按照哈希表的方式來組織的。Redis 支持很多數據結構指的是 value …

系統架構設計師—系統架構設計篇—特定領域軟件體系結構

文章目錄 概述領域分類垂直域水平域 系統模型基本活動參與角色 概述 特定領域軟件架構&#xff08;Domain Specific Software Architecture&#xff0c;DSSA&#xff09;是在一個特定應用領域中&#xff0c;為一組應用提供組織結構參考的標準團建體系結構。 領域分類 垂直域…

OpenManus:優點突出,短板也明顯

最近&#xff0c;OpenManus 在 AI 領域掀起了一陣熱潮。作為開源版的智能代理軟件&#xff0c;它自誕生起就備受矚目。今天&#xff0c;咱們就來深入聊聊 OpenManus 在實際測試中的表現&#xff0c;看看它到底有哪些過人之處&#xff0c;又存在哪些不足。? 優點大起底? 開源…

VUE3項目的文檔結構分析

1. Vue 3 項目的文檔結構 Vue 3 項目通常基于 Vue CLI 或 Vite 等工具創建&#xff0c;其文檔結構如下&#xff1a; 常見目錄結構 my-vue-project/ ├── public/ # 靜態資源目錄 │ ├── index.html # 入口頁面 ├── src/ …

P8662 [藍橋杯 2018 省 AB] 全球變暖--DFS

P8662 [藍橋杯 2018 省 AB] 全球變暖--dfs 題目 解析講下DFS代碼 題目 解析 這道題的思路就是遍歷所有島嶼&#xff0c;判斷每一塊陸地是否會沉沒。對于這種圖的遍歷&#xff0c;我們首先應該想到DFS。 代碼的注意思想就是&#xff0c;在主函數中遍歷找出所有島嶼&#xff0c…

mmseg

系列文章目錄 文章目錄 系列文章目錄bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…

AI多模態教程:DeepSeek多模態模型解析及實踐指南

AIGCmagic社區知識星球是國內首個以AIGC全棧技術與商業變現為主線的學習交流平臺&#xff0c;涉及AI繪畫、AI視頻、大模型、AI多模態、數字人以及全行業AIGC賦能等100應用方向。星球內部包含海量學習資源、專業問答、前沿資訊、內推招聘、AI課程、AIGC模型、AIGC數據集和源碼等…

【銀河麒麟高級服務器操作系統實例】虛擬機橋接網絡問題分析及處理

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

使用騰訊ncnn加速推理yolo v9對比opencv dnn

前面博客 【opencv dnn模塊 示例(25) 目標檢測 object_detection 之 yolov9 介】 紹了 yolov9 詳細使用方式&#xff0c;重參數化、導出端到端模型&#xff0c;使用 torch、opencv、tensorrt 以及 paddle 的測試。 由于存在移動端推理部署的需求&#xff0c;需要進行加速處理&…

前端小食堂 | Day10 - 前端路由の時空裂隙

??? 今日穿梭指南:兩種維度の路由宇宙 1. Hash 模式:錨點の量子隧道 // 手動創建路由監聽器 window.addEventListener(hashchange, () => {const path = location.hash.slice(1) || /; console.log(進入哈希宇宙:, path); renderComponent(path); }); // 編程…

C語言學習筆記-進階(7)字符串函數3

1. strstr的使用和模擬實現 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. &#xff08;函數返回字符串str2在字符串str1中第?次出現的位置&#x…

HarmonyOS Next 屬性動畫和轉場動畫

HarmonyOS Next 屬性動畫和轉場動畫 在鴻蒙應用開發中&#xff0c;動畫是提升用戶體驗的關鍵要素。通過巧妙運用動畫&#xff0c;我們能讓應用界面更加生動、交互更加流暢&#xff0c;從而吸引用戶的注意力并增強其使用粘性。鴻蒙系統為開發者提供了豐富且強大的動畫開發能力&…

PHP:phpstudy無法啟動MySQL服務問題解決

文章目錄 一、問題說明二、解決問題 一、問題說明 我的Windows10系統&#xff0c;之前安裝過MySQL5.7的版本。 然后&#xff0c;用phpstudy安裝MySQL8&#xff0c;并啟動MySQL8。 發生無法啟動的情況。 二、解決問題 1、刪除本地MySQL7的服務 net stop MySQL //這里的服務名…

Nginx(基礎安裝+配置文件)

目錄 一.Nginx基礎 1.基礎知識點 2.異步非阻塞機制 二.Nginx安裝 2.1安裝nginx3種方式 1.包管理工具安裝&#xff08;yum/apt&#xff09; 2.本地包安裝&#xff08;rpm/dpkg&#xff09; 3.源碼編譯安裝 3.1 源碼編譯安裝nginx流程&#xff08;ubuntu&#xff09; 1.…

C++ Windows下屏幕截圖

屏幕截圖核心代碼&#xff08;如果要求高幀率&#xff0c;請使用DxGI&#xff09;&#xff1a; // RGB到YUV的轉換公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …

修改jupyter notebook的工作空間

今天&#xff0c;我之前R配置jupyter工作空間&#xff0c;講了各種語言內核分配不同的工作空間&#xff0c;雖然是方便管理&#xff0c;但有個問題就是需要每次都進入C盤的配置文件找到notebook的工作空間設置路徑打開修改嘛。 因此&#xff0c;今天我編寫了一個python腳本&am…

江科大51單片機筆記【9】DS1302時鐘可調時鐘(下)

在寫代碼前&#xff0c;記得把上一節的跳線帽給插回去&#xff0c;不然LCD無法顯示 一.DS1302時鐘 1.編寫DS1302.c文件 &#xff08;1&#xff09;重新對端口定義名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;&#xff08;2&#xff09;初始化 因為…

電商行業門店管理軟件架構設計與數據可視化實踐

一、行業痛點與核心訴求 在電商多平臺運營成為主流的背景下,企業普遍面臨三大管理難題: ?數據碎片化:某頭部服飾品牌2023年運營報告顯示,其分布在8個平臺的162家門店,日均產生23萬條訂單數據,但財務部門需要5個工作日才能完成跨平臺利潤核算。?成本核算失真:行業調研…