代碼隨想錄算法訓練營刷題復習10:二叉樹、二叉搜索樹復習2

二叉樹、二叉搜索樹 力扣題復習

  1. 110. 平衡二叉樹
  2. 257. 二叉樹的所有路徑
  3. 404. 左葉子之和
  4. 513. 找樹左下角的值
  5. 112.路徑之和
  6. 113.路經總和ii
  7. 450. 刪除二叉搜索樹中的節點
  8. 701. 二叉搜索樹中的插入操作

110. 平衡二叉樹
左右子樹高度差要小于1
->遞歸調用(need新的函數),遇到空就返回0
->left計算左子樹高度 right計算右子樹高度
->遇到-1就返回-1
->最后計算高度差,大于1就返回-1
->回到isBalance,遇到-1說明不平衡

/*** 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 getHeight(TreeNode* node) {if(node == NULL)return 0;int left_h = getHeight(node->left);if(left_h == -1)return -1;int right_h = getHeight(node->right);if(right_h == -1)return -1;return abs(left_h-right_h) > 1 ? -1 : 1+max(left_h,right_h);}bool isBalanced(TreeNode* root) {return (getHeight(root)==-1)? false:true;}
};

257. 二叉樹的所有路徑

記錄頭結點到每個葉子節點的路徑,需要用到回溯
①traversal遞歸函數,參數root、res、path(回溯熟悉的兩件套+root)
②(前提:保證傳入函數的節點非空)
第一步,先把值存到path,(to_string)
第二步,終止條件:到達葉子節點,path寫入res,return
第三步,判斷左孩,不空,
path加入->,遞歸調用
回溯,path彈出 - 和>
第四步,判斷右孩,不空,同第三步處理

/*** 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:void traversal(TreeNode* cur, string path, vector<string>& res) {path += to_string(cur->val);if(cur->left==NULL && cur->right==NULL) {res.push_back(path);return;}if(cur->left != NULL) {path += "->";traversal(cur->left,path,res);path.pop_back();path.pop_back();}if(cur->right != NULL) {path += "->";traversal(cur->right,path,res);path.pop_back();path.pop_back();}}vector<string> binaryTreePaths(TreeNode* root) {string path;vector<string> res;if(root==NULL)return res;traversal(root,path,res);return res;}
};

404. 左葉子之和

左葉子之和:
①判root空 返回0; 判root無左右孩子,返回0;
②遞歸調用有返回值:
left 記錄左子樹的左葉子之和
滿足條件:node左孩不空,node左孩沒有孩(為葉子節點),更新left值
right記錄右子樹中的左葉子之和
返回left+right一共的左葉子之和

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if(root==NULL)return 0;if(root->left==NULL && root->right==NULL)return 0;int left_value = sumOfLeftLeaves(root->left);if(root->left && !root->left->left && !root->left->right)left_value = root->left->val;int right_value = sumOfLeftLeaves(root->right);return left_value + right_value;}
};

513. 找樹左下角的值
層序遍歷,添加記錄每一層的第一個元素result(如果還有下一層直接把上一層的保存的值覆蓋掉就行)

class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int result = 0;if(root==NULL) return 0;que.push(root);while(!que.empty()) {int size = que.size();for(int i=0;i<size;i++) {TreeNode* node = que.front();que.pop();if(i==0)result = node->val;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return result;}
};

112.路徑之和

路徑之和(這輪沒寫出來)

class Solution {
public:int traversal(TreeNode* node, int temp_sum) {if(!node->left && !node->right && temp_sum==0)return true;else if(!node->left && !node->right)return false;if(node->left) {temp_sum-=node->left->val;if(traversal(node->left,temp_sum))return true;temp_sum+=node->left->val;}if(node->right) {temp_sum-=node->right->val;if(traversal(node->right,temp_sum))return true;temp_sum+=node->right->val;}return false;}bool hasPathSum(TreeNode* root, int targetSum) {if(root==NULL)return false;return traversal(root,targetSum-root->val);}
};

113.路經總和ii
也是需要用到回溯,這個題和上一個題可以再復習下。

class Solution {
public:vector<vector<int>> res;vector<int> path;void traversal(TreeNode* root,int temp_sum) {if(!root->left && !root->right && temp_sum==0) {res.push_back(path);return;}else if(!root->left && !root->right)return;if(root->left) {temp_sum-=root->left->val;path.push_back(root->left->val);traversal(root->left,temp_sum);temp_sum+=root->left->val;path.pop_back();}if(root->right) {temp_sum-=root->right->val;path.push_back(root->right->val);traversal(root->right,temp_sum);temp_sum+=root->right->val;path.pop_back();}return;}vector<vector<int>> pathSum(TreeNode* root, int targetSum) {if(root==NULL)return res;path.push_back(root->val);traversal(root,targetSum-root->val);return res;}
};

450. 刪除二叉搜索樹中的節點

二叉搜索樹:比大小
==①無孩子節點,直接刪
②有左孩
左孩替代當前node
③有右孩
右孩替代當前node
③左右孩都存在
while找到右子樹的最左下的孩兒,繼承node的左子樹,然后將node更新為右孩。

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root==nullptr)return root;if(root->val==key) {if(root->left==nullptr && root->right==nullptr) {delete root;return nullptr;}else if(root->right==nullptr) {auto retnode = root->left;delete root;return retnode;}else if(root->left==nullptr) {auto retnode = root->right;delete root;return retnode;}else {TreeNode* cur = root->right;//這里是找到右子樹的最左葉子節點while(cur->left!=nullptr) cur = cur->left;cur->left = root->left;TreeNode* temp = root;root = root->right;delete temp;return root;}}if(root->val < key) {root->right = deleteNode(root->right,key);}if(root->val > key) {root->left = deleteNode(root->left,key);}return root;}
};

701. 二叉搜索樹中的插入操作
插入一定是在葉子節點的位置,關鍵在于找到插入點的位置:二叉搜索樹的特性 比大小

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(root==nullptr) {TreeNode* node = new TreeNode(val);return node;}if(root->val > val)root->left = insertIntoBST(root->left,val);if(root->val < val)root->right = insertIntoBST(root->right,val);return root;}
};

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

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

相關文章

API-元素尺寸與位置

學習目標&#xff1a; 掌握元素尺寸與位置 學習內容&#xff1a; 元素尺寸與位置仿京東固定導航欄案例實現bilibili點擊小滑塊移動效果 元素尺寸與位置&#xff1a; 使用場景&#xff1a; 前面案例滾動多少距離&#xff0c;都是我們自己算的&#xff0c;最好是頁面滾動到某個…

[leetcode]圓圈中最后剩下的數字/ 破冰游戲

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

程序猿大戰Python——Python與MySQL交互一

pymysql模塊的安裝 目標&#xff1a;了解如何安裝pymysql模塊&#xff1f; 當要使用Python和MySQL數據庫進行交互&#xff0c;需要借助一個第三方模塊&#xff1a;pymysql。 在使用pymysql模塊前&#xff0c;先進行安裝&#xff1a; pip install pymysql 有時使用pip instal…

從零開始做題:有手就行

1 題目 2 解題 ARPHCR工具破解 得到flag DASCTF{2b3767763885a019b65bbfe9d1136c3b}

數據結構與算法筆記:高級篇 - 向量空間:如何實現一個簡單的音樂推薦系統?

概述 很多人喜都喜愛聽歌&#xff0c;以前我們用 MP3 聽歌&#xff0c;現在直接通過音樂 App 在線就能聽歌。而且&#xff0c;各種音樂 App 的功能越來越強大&#xff0c;不僅可以自己選歌聽&#xff0c;還可以根據你聽歌的喜好&#xff0c;給你推薦你可能會喜好的音樂&#x…

【WEB前端2024】3D智體編程:喬布斯3D紀念館-第49課-機器人自動跳舞

【WEB前端2024】3D智體編程&#xff1a;喬布斯3D紀念館-第49課-機器人自動跳舞 使用dtns.network德塔世界&#xff08;開源的智體世界引擎&#xff09;&#xff0c;策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎…

DevExpress Office File API教程 - 如何使用AI服務增強Word文檔可訪問性和語言支持?

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫&#xff0c;不用安裝Microsoft Office&#xff0c;就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

使用隱式事件執行控制圖

什么是隱式事件&#xff1f; 隱式事件是圖表執行時發生的內置事件&#xff1a; 圖表喚醒 進入一個狀態 退出狀態 分配給內部數據對象的值 這些事件是隱式的&#xff0c;因為您沒有顯式地定義或觸發它們。隱式事件是它們發生的圖表的子級&#xff0c;僅在父圖表中可見。 隱式事…

【AI生成】海上風電中衛星網絡與無線自組網的應用分析

隨著可再生能源的不斷發展&#xff0c;海上風電作為其中的重要組成部分&#xff0c;在我國能源結構調整中占據越來越重要的地位。近年來&#xff0c;我國海上風電產業發展迅速&#xff0c;海上風電場數量和規模不斷擴大&#xff0c;相應地&#xff0c;海上風電運維和安全保障的…

git branch -a 不顯示遠程分支修復

使用git remote -v命令&#xff0c;查看所有的遠程倉庫及其URL如果沒有&#xff0c;說明沒有遠程倉庫&#xff0c;繼續往下走使用git remote add origin <url>命令來添加或修改遠程倉庫&#xff1a;其中<url>是遠程倉庫的正確URL&#xff0c;就是git項目的http的地…

實現Java中的圖像處理功能

實現Java中的圖像處理功能 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本篇文章中&#xff0c;我們將探討如何在Java中實現圖像處理功能。圖像處理是計算機…

Embedding的概念和展開

前言 本章&#xff0c;我們介紹一個非常細的細節技術。讓我們微調大模型的一些特性和能力。 在大模型的AI套路演化過程中&#xff0c;其實經歷了太多的技術革新和方式變化&#xff0c;Embedding其實也可能是其中一個高速湮滅的技術點之一。 對比LoRA現在大紅大紫&#xff0c…

每個 Node.js 開發人員都應該知道的13個庫(下)

7. Sequelize Mongoose是一個Node。基于js的MongoDB對象建模工具&#xff0c;通常被稱為對象數據建模&#xff08;ODM&#xff09;庫&#xff0c;它提供了諸如鉤子、模型驗證、連接和查詢等功能。 Mongoose為應用程序數據提供了一個基于模式的解決方案&#xff0c;它在應用程…

【JavaScript腳本宇宙】玩轉數據存儲:深入剖析提升 Web 應用程序性能的六大利器

從本地到云端&#xff1a;全面解析滿足各種需求的高性能 JavaScript 數據庫庫 前言 本文將介紹幾個流行的JavaScript數據庫庫&#xff0c;包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每個庫都有自己的特點和適用場景。通過比較它們的功能和使用方式&#xff0c;可以…

論文翻譯 | ITER-RETGEN:利用迭代檢索生成協同增強檢索增強的大型語言模型

論文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 檢索增強生成由于有望解決包括過時知識和幻覺在內的大型語言模型的局限性而引起廣泛關注。然而&#xff0c;檢索器很難捕捉相關性&#xff0c;尤…

BurpSuite2024.5.3專業版,僅支持Java21以上

01更新介紹 此版本引入了對 WebSocket 的 Burp Scanner 支持、對錄制的登錄編輯器的改進、WebSocket 匹配和替換規則以及許多性能改進。我們還刪除了一些冗余的掃描檢查。 Burp Scanner 對 WebSockets 的支持我們更新了內部代理的配置&#xff0c;以允許 WebSocket 流量。這使…

代碼隨想錄算法訓練營第五十一天| 115.不同的子序列、583. 兩個字符串的刪除操作、 72. 編輯距離

LeetCode 115.不同的子序列 題目鏈接&#xff1a;https://leetcode.cn/problems/distinct-subsequences/description/ 文章鏈接&#xff1a;https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]&#xff1a;以i-1…

Docker快速極簡配置nginx實現不同域名訪問分流

文章目錄 前言安裝配置使用鏡像拉取及環境配置修改代理文件編寫docker-compose文件啟動nginx代理 總結 前言 本文主要記錄如何使用docker安裝配置Nginx&#xff0c;如何使用Nginx把通過80、443端口訪問的請求根據域名分發到不同端口。那么什么是Nginx呢&#xff0c;下邊做個簡…

將產品制作成3D模型在網站上展示需要多少費用?

將產品制作成3D模型并在網站上展示的費用會因多種因素而異&#xff0c;包括模型的復雜度、所需的細節程度、制作3D模型的軟件和工具、以及是否需要專業設計師的服務等。此外&#xff0c;不同的3D模型制作服務提供商可能會有不同的定價標準。 如果能自己制作3D模型&#xff0c;…

友力科技IDC機房搬遷方案流程分享

機房搬遷流程 系統搬遷實施流程包括&#xff1a;準備、拆卸、裝運、安裝、調試等五個流程&#xff0c;具體如下&#xff1a; 準備:包括相關人員和設備準備、新機房環境準備、網絡環境、備份、現場所有設備打標簽、模塊、設備準備等準備工作。拆卸&#xff1a;主要只核心設備下…