代碼隨想錄算法訓練營:14/60

非科班學習算法day14?| LeetCode266:翻轉二叉樹?,Leetcode101: 對稱二叉樹,Leetcode100:相同的的樹?,LeetCode572:另一顆樹的子樹,LeetCode104:二叉樹的最大深度,LeetCode559:N叉樹的最大深度

目錄

介紹

一、基礎概念補充:

1.二叉樹的深度和高度??

二、LeetCode題目

1.Leetcode226: 翻轉二叉樹

題目解析

2.Leetcode101: 對稱二叉樹

題目解析

3.Leetcode100:相同的樹?

題目解析

4.Leetcode572:另一棵樹的子樹?

題目解析

5.Leetcode104: 二叉樹的最大深度

題目解析

6.Leetcode559: N叉樹的最大深度

題目解析

總結


介紹

包含LC的幾道題目,還有相應概念的補充。

相關圖解和更多版本:

代碼隨想錄 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、基礎概念補充:

1.二叉樹的深度和高度??

代碼隨想錄 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

二、LeetCode題目

1.Leetcode226: 翻轉二叉樹

題目鏈接:226. 翻轉二叉樹 - 力扣(LeetCode)

題目解析

? ? ? ?單層邏輯:交換左右兩個孩子節點,所以采用后序遍歷或者前序遍歷都可以。

如果是采用層序遍歷就要把每一層的結果記錄之后反轉。

遞歸C++代碼如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (!root)return root;invertTree(root->left);invertTree(root->right);swap(root->left, root->right);return root;}
};

層序遍歷c++代碼如下:?

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {//層序遍歷//建立輔助隊列queue<TreeNode*> que;//插入根節點if(root != nullptr) {que.push(root);}//初始化sizeint size = que.size();//層序遍歷while(!que.empty()){while(size--){//記錄當前頭節點TreeNode* cur_node = que.front();//彈出que.pop();//交換左右子節點swap(cur_node->left, cur_node->right);//加入當前左右節點if(cur_node->left != nullptr) que.push(cur_node->left);if(cur_node->right != nullptr) que.push(cur_node->right);}//更新sizesize = que.size();}//return root;}
};

2.Leetcode101: 對稱二叉樹

題目鏈接:101. 對稱二叉樹 - 力扣(LeetCode)

題目解析

? ? ? ?首先就是一個誤區就可能會默認把root的情況作為中止條件,那么不難發現,這樣就可能需要回溯再比較節點的信息,實際上并沒有這么復雜,依托示例給出的三層樹就可以發現可以利用子節點的狀態來分別檢查左右兩棵子樹的信息,進而可以比較是否相同。

遞歸C++代碼如下:?

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:// 前序遞歸bool dfs(TreeNode* left, TreeNode* right) {if (left == nullptr && right == nullptr)return true;if (left != nullptr && right != nullptr && left->val == right->val) {// dfs(left->left, right->right);// dfs(left->right, right->left);return (dfs(left->left, right->right) &&dfs(left->right, right->left));}return false;}bool isSymmetric(TreeNode* root) {if (!root)return true;return dfs(root->left, root->right);}
};
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSame(TreeNode* left, TreeNode* right){if(!left&&!right)return true;else if(!left||!right) return false;else if(left->val != right->val) return false;else {//檢查外層bool outside = isSame(left->left, right->right);//檢查內層bool inside = isSame(left->right, right->left);return outside&&inside;}}bool isSymmetric(TreeNode* root) {return isSame(root->left, root->right);}
};

3.Leetcode100:相同的樹?

題目鏈接:100. 相同的樹 - 力扣(LeetCode)

題目解析

? ? ? ?101和572的思路和上面的題目的思路非常相近,細節處理不同罷了

遞歸C++代碼如下:?

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q) {if(!p && !q) return true;else if(!p || !q) return false;else if(p->val != q->val) return false;//isSameTree(p->left, q->left);//isSameTree(p->right, q->right);else return bool(isSameTree(p->left, q->left)&&isSameTree(p->right, q->right));}
};

4.Leetcode572:另一棵樹的子樹?

題目鏈接:572. 另一棵樹的子樹 - 力扣(LeetCode)

題目解析

? ? ? ?101和572的思路和上面的題目的思路非常相近,細節處理不同罷了

遞歸C++代碼如下:?

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:bool isSametree(TreeNode* root, TreeNode* subRoot) {if (!root && !subRoot)return true;else if (!root || !subRoot)return false;else if (root && root->val == subRoot->val)return (isSametree(root->left, subRoot->left) &&isSametree(root->right, subRoot->right));elsereturn false;}bool isSubtree(TreeNode* root, TreeNode* subRoot) {if (!root)return false;if (isSametree(root, subRoot))return true;return isSubtree(root->left, subRoot) ||isSubtree(root->right, subRoot);}
};

5.Leetcode104: 二叉樹的最大深度

題目鏈接:104. 二叉樹的最大深度 - 力扣(LeetCode)

題目解析

? ? ? ?把問題歸結為最小單元,一層的二叉樹,層數為一,最大深度為一;兩層的二叉樹,有左節點,沒有右節點,最大深度為2......那么其實遞推的過程就是在看左右最大路徑然后返回這個值。

層序迭代C++代碼如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {// 建立輔助隊列queue<TreeNode*> que;// 初始化層數int count = 0;// 插入根節點if (root != nullptr) {que.push(root);}// 初始化sizeint size = que.size();// 層序遍歷求取層數while (!que.empty()) {while (size--) {// 保存頭節點信息TreeNode* cur_node = que.front();// 彈出頭節點que.pop();// 加入彈出節點的左右子節點if (cur_node->left != nullptr)que.push(cur_node->left);if (cur_node->right != nullptr)que.push(cur_node->right);}// 記錄層數count++;// 更新sizesize = que.size();}return count;}
};

?遞歸c++代碼如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {//設置遞歸中止出口if(root == nullptr) return 0;//后序遍歷遞歸體int depth_L = maxDepth(root->left);int depth_R = maxDepth(root->right);int maxdepth = max(depth_L, depth_R) + 1;return maxdepth;}
};

?簡潔版:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {// 設置遞歸中止出口if (root == nullptr)return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

注意點:在LeelCode中深度是按照節點數量算的,而不是邊的數量。

6.Leetcode559: N叉樹的最大深度

題目鏈接:559. N 叉樹的最大深度 - 力扣(LeetCode)

題目解析

? ? ? ?和二叉樹最大的不同就是如何把多個分支都寫出來。

遞歸C++代碼如下:

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:int maxDepth(Node* root) {int cur_depth = 0;if (!root)return 0;for (auto child : root->children) {cur_depth = max(cur_depth, maxDepth(child));}return cur_depth + 1;}
};

總結


補打卡第14天,堅持!!!

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

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

相關文章

CesiumJS【Basic】- #017 精靈動畫的渲染

文章目錄 精靈動畫的渲染1 目標2 實現3 資源文件精靈動畫的渲染 1 目標 完成動畫精靈圖(Animated Sprite Sheet)的渲染 2 實現 import * as Cesium from "cesium";const viewer = new Cesium.

SDK 程序卡在 AXI DMA 配置 (XAxiDma_CfgInitialize)的解決方法

在進行 AXI DMA 配置 時候代碼一直卡在XAxiDma_CfgInitialize函數出不來&#xff0c;也沒有打印報錯。 /* Initialize the XAxiDma device.*/CfgPtr XAxiDma_LookupConfig(DeviceId);if (!CfgPtr) {xil_printf("No config found for %d\r\n", DeviceId);return XST_…

Ubuntu安裝指定內核版本教程

Ubuntu安裝內核 1.查看當前os已安裝的內核 $sudo dpkg --get-selections |grep linux-image linux-image-5.10.0-1013-oem install linux-image-5.11.0-27-generic install linux-image-5.11.0-41-generic install …

ResNet-50算法

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、理論知識儲備 1.CNN算法發展 AlexNet是2012年ImageNet競賽中&#xff0c;由Alex Krizhevsky和Ilya Sutskever提出&#xff0c;在2012年ImageNet競賽中&a…

頭歌——機器學習——支持向量機案例

第1關&#xff1a;基于支持向量機模型的應用案例 任務描述 本關任務&#xff1a;編寫一個基于支持向量機模型的應用案例。 相關知識 在本應用案例中&#xff0c;我們借助一個具體的實際問題&#xff0c;來完整地實現基于支持向量機模型的開發應用。在此訓練中&#xff0c;我…

運籌系列93:VRP精確算法

1. MTZ模型 MTZ是Miller-Tucker-Zemlin inequalities的縮寫。除了定義是否用到邊 x i j x_{ij} xij?外&#xff0c;還需要定義一個 u i u_i ui?用來表示此時車輛的當前載貨量。注意這里x變量需要定義為有向。 這里定義為pickup問題&#xff0c;代碼為&#xff1a; using Ju…

數據庫系統概論-第11章并發控制

允許多個用戶同時使用同一個數據庫的數據庫系統稱為多用戶數據庫系統。 事務可以一個一個地中行執行&#xff0c;即每個時刻只有一個事務運行&#xff0c;其他事務必須等到這個事務結束以后方能運行。 單處理機系統中&#xff0c;事務的并行執行實際上是這些并行事務的并行操…

windows下載jdk并安裝步驟(保姆級教程)

一、下載jdk 下載地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二、雙擊下載好的jdk 更改安裝目錄然后點擊下一步 然后會彈出jre的安裝&#xff0c;需要選擇路徑&#xff08;注意&#xff1a;這里的路徑必須跟前面的jdk在…

ocr數據不夠,怎么造數據

1.確定特定字體類型&#xff1b; 2.收集合適的圖片作為背景 3.在背景圖上填寫特定字體的字符內容 1&#xff09;字體無法確認時怎么辦&#xff1f; 方法一&#xff1a;可以將文本行裁剪出來去網站上確認&#xff0c;網站鏈接&#xff1a;字體識別-在線掃一掃圖片找字體-搜字…

將huggingface的大模型轉換為safetensor格式

很多huggingface的大語言模型都是pytorch的格式&#xff0c;但是mindie需要safetensor格式&#xff0c;另外mindieservice加載原始的baichuan2-13b的模型出錯&#xff0c;后來排查是bfloat16數據格式的問題&#xff0c;所以這次轉換要一次性轉為float16的格式。 上代碼&#x…

計算機網絡:如何隱藏真實的IP和MAC地址?

目錄 一、什么是MAC地址二、什么是IP地址三、如何隱藏真實的MAC地址四、如何隱藏真實的IP地址 一、什么是MAC地址 MAC地址&#xff0c;全稱為媒體訪問控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一種用于網絡通信的唯一標識符。它是由IEEE 8…

PLC網關如何選擇?plc網關作用-天拓四方

一、PLC網關在工業自動化領域的重要性和作用 PLC網關在工業自動化領域的重要性和作用不言而喻。作為工業自動化系統的重要組成部分&#xff0c;PLC網關起到了關鍵的橋梁作用&#xff0c;實現了PLC與其他設備、系統之間的數據傳輸和通信。 首先&#xff0c;PLC網關的重要性體現…

【華為OD機試】 約瑟夫問題(C++/Java/Python)

題目 題目描述 輸入一個由隨機數組成的數列(數列中每個數均是大于 0 的整數,長度已知),和初始計數值 m。 從數列首位置開始計數,計數到 m 后,將數列該位置數值替換計數值 m, 并將數列該位置數值出列,然后從下一位置從新開始計數,直到數列所有數值出列為止。 如果計數到…

最像人聲的語音合成模型-ChatTTS

目錄 寫在前面 一、使用ChatTTS 二、優點 三、局限 寫在前面 最像人聲的AI來了&#xff01;語音開源天花板ChatTTS火速出圈&#xff0c;3天就斬獲9k個star。截至發稿前&#xff0c;已經25.9k個star了。這是專門為對話場景設計的語音生成模型&#xff0c;用于LLM助手對話任務…

SUSE linux的啟動過程介紹

引導Linux系統涉及不同的組件和任務。在固件和硬件初始化過程&#xff08;取決于機器的架構&#xff09;之后&#xff0c;內核通過引導加載程序GRUB2啟動。此后&#xff0c;引導過程完全由操作系統控制并由systemd處理。systemd提供了一組“target”&#xff0c;用于為日常使用…

微信開放平臺(第三方平臺)

特征&#xff1a; 統一管理&#xff1a; 可以統一管理和操作多個公眾號和小程序&#xff0c;提供批量化、集中化的服務。 代開發和運營&#xff1a; 為公眾號和小程序提供代開發和運營服務&#xff0c;例如提供自動回復、模板消息、用戶管理等功能。 接口調用&#xff1a; 通過…

基于深度學習的模糊圖像還原

基于深度學習的模糊圖像還原 模糊圖像還原&#xff08;Image Deblurring&#xff09;是計算機視覺中的一個重要任務&#xff0c;旨在從模糊的圖像中恢復出清晰的圖像。模糊可以由于多種原因產生&#xff0c;例如相機抖動、運動模糊、焦點失準等。傳統的圖像去模糊方法通常依賴…

搭建抖音微短劇系統:源碼部署與巨量廣告回傳全解析

在數字化浪潮中&#xff0c;抖音微短劇已成為內容創作的新寵。想要搭建一個高效的抖音微短劇系統&#xff0c;并實現與巨量廣告的有效回傳嗎&#xff1f;本文將為您詳細解析源碼部署與廣告回傳的關鍵步驟。 一、源碼部署&#xff1a;構建短劇系統的基石 源碼是軟件開發的起點…

vscode遠程連接Ubantu

一、首先用VM虛擬機打開一個Linux系統 二、打開VScode 在擴展里安裝 安裝后&#xff0c;打開Linux查看IP地址 在VScode 中新建連接主機 輸入linux_nameip地址 -A 然后輸入Linux的登錄密碼 就可以遠程操控 Linux了 可以在終端中遠程控制Linux 點擊左上角的打開文件夾可以很…

什么是 Azure OpenAI?

目錄 一、說明 二、什么是 Azure OpenAI 2.1 網絡結構 2.2 、為什么使用 Azure OpenAI 2.3 如何使用 Azure OpenAI 三、從哪里開始 Azure OpenAI 之旅 3.1 關于 Azure OpenAI&#xff0c;我還需要了解什么 3.2 RBAC 權限和角色 3.3 演示 1&#xff1a;在公共數據上應用…