【代碼隨想錄算法訓練營——Day15】二叉樹——110.平衡二叉樹、257.二叉樹的所有路徑、404.左葉子之和、222.完全二叉樹的節點個數

在這里插入圖片描述

LeetCode題目鏈接
https://leetcode.cn/problems/balanced-binary-tree/
https://leetcode.cn/problems/binary-tree-paths/
https://leetcode.cn/problems/sum-of-left-leaves/
https://leetcode.cn/problems/count-complete-tree-nodes/

題解
110.平衡二叉樹
在這里插入圖片描述
在這里插入圖片描述

想到用左子樹的高度減右子樹的高度,但遞歸不知道怎么求高度。在求高度的函數里,高度depth放在條件里還是在函數體里重新定義一個變量。用層序遍歷求高度行不行?不用遞歸?
看了題解,首先明確遞歸終止條件,遇到空結點時高度為0。接著遞歸得到左右子樹的高度,并確定一個規則,就是當遇到的樹不是平衡樹時,返回-1。但對高度判斷的條件又怎么寫呢?直接判斷是否等于-1。在后面計算result值時,要把當前結點的高度也加上,左右子樹的高度的最大值。
通過結點傳回的高度為0確定整棵樹的高度基點,然后往上返回時都能令符合平衡二叉樹結點的”根“結點高度值加1,當某個結點不滿足平衡二叉樹的要求時,它以及它上面的所有結點高度值都將為-1。-1是個標記,標記本樹中出現了不符合平衡二叉樹的子樹。

257.二叉樹的所有路徑
知道用回溯的方法寫這道題,但不知道怎么放每次的遞歸條件。答案是當前的路徑(因為要回溯)和結果數組(題目要求string)。
自己順著思路寫了一遍代碼,小case過了,最后也過了。

404.左葉子之和
想到用遞歸去做,但是每次判斷左葉子的條件不知道怎么定,還有一個思路是對每個左結點打標記,但怎么區分左葉子結點和左普通結點。
于是看題解,從左葉子結點的父結點去判斷該結點是否是左葉子結點,這個思路其實我想到了,但一開始覺得麻煩,就沒定下來。遞歸邊界要確定,返回的是左葉子結點的值。后續的遞歸分支寫法和110.平衡二叉樹很像,但要注意求了賦值了兩次同一個值,原因是左子樹的值如果求出來了,而左葉子結點如果遞歸了返回的是0,這時需要在當前判斷求左葉子結點的值,并重新賦值覆蓋前面的。
有一個錄友說,第一個是遞歸過程,第二個是真的在求葉子結點的值。

222.完全二叉樹的節點個數
這一題是我唯一會的一題,用迭代法,任何一種遍歷順序都可以,但用遞歸法。寫成了求葉子結點個數的代碼,改了一下要加上當前結點的個數。看了一下題解,跟我寫的也差不多。

代碼

//110.平衡二叉樹
#include <iostream>
using namespace std;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 isBalanced(TreeNode* root) {int depth = getHeight(root);if (depth == -1) return false;else return true;}int getHeight(TreeNode* root) {if (root == NULL) return 0;int leftHeight = getHeight(root->left);int rightHeight = getHeight(root->right);if (leftHeight == -1) return -1;if (rightHeight == -1) return -1;if (abs(leftHeight - rightHeight) > 1)return -1;else return 1 + max(leftHeight, rightHeight);}
};int main() {int nums1[30] = { 3,9,20,NULL,NULL,15,7 }, nums2[30] = { 1,2,2,3,3,NULL,NULL,4,4 };TreeNode* root1 = new TreeNode(3);root1->left = new TreeNode(9);root1->right = new TreeNode(20);root1->right->left = new TreeNode(15);root1->right->right = new TreeNode(7);TreeNode* root2 = new TreeNode(1);root2->left = new TreeNode(2);root2->right = new TreeNode(2);root2->left->left = new TreeNode(3);root2->left->right = new TreeNode(3);root2->left->left->left = new TreeNode(4);root2->left->left->right = new TreeNode(4);Solution s;printf("%d", s.isBalanced(root2));return 0;
}
//257.二叉樹的所有路徑
#include <iostream>
#include <vector>
#include <string>
using namespace std;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:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;path.push_back(root->val);travelsal(root, path, result);return result;}void travelsal(TreeNode* cur, vector<int> &path, vector<string> &result) {if (cur->left == NULL && cur->right == NULL) {string sPath;for (int i = 0;i < path.size() - 1;i++) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);}if (cur->left) {path.push_back(cur->left->val);travelsal(cur->left, path, result);path.pop_back();}if (cur->right) {path.push_back(cur->right->val);travelsal(cur->right, path, result);path.pop_back();}}
};int main() {int nums1[30] = { 1,2,3,NULL,5 }, nums2[30] = { 1 };TreeNode* root1 = new TreeNode(1);root1->left = new TreeNode(2);root1->right = new TreeNode(3);root1->left->right = new TreeNode(5);TreeNode* root2 = new TreeNode(1);Solution s;vector<string> result = s.binaryTreePaths(root2);for (int i = 0;i < result.size();i++) {cout << result[i] << " " << endl;}return 0;
}
//404.左葉子之和
#include <iostream>
using namespace std;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 sumOfLeftLeaves(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right == NULL) return 0;int leftValue = sumOfLeftLeaves(root->left);if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {leftValue = root->left->val;}int rightValue = sumOfLeftLeaves(root->right);return leftValue + rightValue;}
};int main() {int nums1[30] = { 3,9,20,NULL,NULL,15,7 }, nums2[30] = { 1 };TreeNode* root1 = new TreeNode(3);root1->left = new TreeNode(9);root1->right = new TreeNode(20);root1->right->left = new TreeNode(15);root1->right->right = new TreeNode(7);TreeNode* root2 = new TreeNode(1);Solution s;printf("%d", s.sumOfLeftLeaves(root2));return 0;
}
//222.完全二叉樹的節點個數
#include <iostream>
using namespace std;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 countNodes(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right == NULL) return 1;int leftNum = countNodes(root->left);int rightNum = countNodes(root->right);return leftNum + rightNum + 1;}
};int main() {int nums1[30] = { 1,2,3,4,5,6 }, nums2[30] = {}, nums3[30] = {1};TreeNode* root1 = new TreeNode(1);root1->left = new TreeNode(2);root1->right = new TreeNode(3);root1->left->left = new TreeNode(4);root1->left->right = new TreeNode(5);root1->right->left = new TreeNode(6);TreeNode* root2 = nullptr;TreeNode* root3 = new TreeNode(1);Solution s;printf("%d", s.countNodes(root3));return 0;
}

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

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

相關文章

JVM新生代/老年代垃圾回收器、內存分配與回收策略

新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器&#xff0c;是一個單線程收集器。 串行收集器在進行垃圾回收時只使用一個CPU或一條收集線程去完成垃圾回收工作&#xff0c;并且會暫停其他的工作線程&#xff08;stop the world&#xff09;&#xff0c;直至回收完…

Unity Mirror 多人同步 基礎教程

Unity Mirror 多人同步 基礎教程MirrorNetworkManager&#xff08;網絡管理器&#xff09;Configuration&#xff1a;配置Auto-Start Options&#xff1a;自動啟動Scene Management&#xff1a;場景管理Network Info&#xff1a;網絡信息Authentication&#xff1a;身份驗證Pla…

基于紅尾鷹優化的LSTM深度學習網絡模型(RTH-LSTM)的一維時間序列預測算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 紅尾鷹優化的LSTM&#xff08;RTH-LSTM&#xff09;算法&#xff0c;是將紅尾鷹優化算法&#xff08;Red-Tailed Hawk Optimization, RTHO&#xff09;與長短期…

深度學習“調參”黑話手冊:學習率、Batch Size、Epoch都是啥?

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;從"煉丹"到科學&#xff0c;…

【網絡實驗】-MUX-VLAN

實驗拓撲實驗要求&#xff1a; 在企業網絡中&#xff0c;企業員工和企業客戶可以訪問企業的服務器&#xff0c;對于企業來說&#xff0c;希望員工之間可以互相交流&#xff0c;但是企業用戶之間相互隔離&#xff0c;不能夠訪問。為了實現所有用戶都可以訪問企業服務器&#xff…

Java泛型:類型安全的藝術與實踐指南

Java泛型&#xff1a;類型安全的藝術與實踐指南 前言&#xff1a;一個常見的編譯錯誤 最近在開發中遇到了這樣一個編譯錯誤&#xff1a; Required type: Callable<Object> Provided: SalesPitchTask這個看似簡單的錯誤背后&#xff0c;隱藏著Java泛型設計的深層哲學。今天…

UMI企業智腦 2.1.0:智能營銷新引擎,圖文矩陣引領內容創作新潮流

在數字營銷日益激烈的今天&#xff0c;企業如何在信息洪流中脫穎而出&#xff1f;UMI企業智腦 2.1.0 的發布為企業提供了全新的解決方案。這款智能營銷工具結合了先進的AI技術與數據驅動策略&#xff0c;幫助企業優化營銷流程、提升效率&#xff0c;并通過圖文矩陣實現內容創作…

Lustre Ceph GlusterFS NAS 需要掛載在k8s容器上,數據量少,選擇哪一個存儲較好

在 K8s 容器環境中&#xff0c;數據量 不大的 規模下&#xff0c;Lustre、Ceph、GlusterFS 和 NAS 的選擇需結合性能需求、運維成本、擴展性和K8s 適配性綜合判斷。以下是針對性分析及推薦&#xff1a;一、核心對比與適用場景二、關鍵決策因素1. 性能需求高并發 / 高吞吐&#…

深入解析 Apache Doris 寫入原理:一條數據的“落地之旅”

在日常的數據分析場景中&#xff0c;我們經常會向 Apache Doris 寫入大量數據&#xff0c;無論是實時導入、批量導入&#xff0c;還是通過流式寫入。但你是否想過&#xff1a;一條數據從客戶端發出&#xff0c;到最終穩定落盤&#xff0c;中間到底經歷了哪些步驟&#xff1f; …

基于MATLAB的視頻動態目標跟蹤檢測實現方案

一、系統架構設計 視頻動態目標跟蹤系統包含以下核心模塊&#xff1a; 視頻輸入模塊&#xff1a;支持攝像頭實時采集或視頻文件讀取預處理模塊&#xff1a;灰度轉換、降噪、光照補償目標檢測模塊&#xff1a;背景建模、運動區域提取跟蹤算法模塊&#xff1a;卡爾曼濾波、粒子濾…

【Python】Python文件操作

Python文件操作 文章目錄Python文件操作[toc]1.文件的編碼2.文件打開、讀取&#xff08;r模式&#xff09;、關閉3.文件的寫入&#xff08;w模式&#xff09;4.文件的追加寫入&#xff08;a模式&#xff09;5.綜合案例1.文件的編碼 意義&#xff1a;計算機只能識別0和1&#x…

CES Asia的“五年計劃”:打造與北美展比肩的科技影響力

在全球科技產業版圖中&#xff0c;展會一直是前沿技術展示、行業趨勢探討以及商業合作達成的關鍵平臺。CES Asia&#xff08;亞洲消費電子技術展&#xff09;作為亞洲科技領域的重要展會&#xff0c;近日明確提出其“五年計劃”&#xff0c;目標是打造與北美展會比肩的科技影響…

【計算機網絡 | 第16篇】DNS域名工作原理

文章目錄3.5 域名系統工作原理主機的標識方式&#xff1a;域名 vs IP 地址標識轉換機制&#xff1a;DNS系統因特網的域名系統&#xff1a;層次域名空間&#x1f426;?&#x1f525;頂級域名分類低級域名與管理域名與IP的區別因特網的域名系統&#xff1a;域名服務器&#x1f9…

YASKAWA安川機器人鋁材焊接節氣之道

在鋁材焊接領域&#xff0c;保護氣體的合理使用對焊接質量與成本控制至關重要。安川焊接機器人憑借高精度與穩定性成為行業常用設備&#xff0c;而WGFACS節氣裝置的應用&#xff0c;則為其在鋁材焊接過程中實現高效節氣提供了創新路徑。掌握二者結合的節氣之道&#xff0c;對提…

GooseDB,一款實現服務器客戶端模式的DuckDB

在網上看到韓國公司開發的一款GooseDB&#xff0c; 官方網站對它的介紹是DuckDB? 的功能擴展分支&#xff0c;具有服務器/客戶端、多會話和并發寫入支持&#xff0c;使用 PostgreSQL 有線協議&#xff08;DuckDB?是 DuckDB 基金會的商標&#xff09; 使用也很簡單&#xff…

lesson62:JavaScript對象進化:ES2025新特性深度解析與實戰指南

目錄 一、迭代器輔助方法&#xff1a;對象數據處理的優雅革命 1.1 核心方法與語法 1.2 對象屬性處理實戰 1.3 性能與兼容性考量 二、JSON模塊原生支持&#xff1a;對象加載的范式轉變 2.1 靜態與動態導入語法 2.2 與傳統方案的對比優勢 2.3 典型應用場景 三、Set集合增…

設計模式學習筆記(一)

設計模式學習筆記&#xff08;一&#xff09; 一般說設計模式都是指面向對象的設計模式&#xff0c;因為面向對象語言可以借助封裝、繼承、多態等特性更好的達到復用性、可拓展性、可維護性。 面向對象一般指以類、對象為組織代碼的基本單元&#xff0c;并將封裝、繼承、多態、…

【CSS】一個自適應大小的父元素,如何讓子元素的寬高比一直是2:1

父元素是自適應大小的容器&#xff08;比如 width:100%&#xff09;&#xff0c;我們希望子元素 始終保持 2:1 寬高比&#xff08;比如寬 200px → 高 100px&#xff0c;寬 300px → 高 150px&#xff09;。 有幾種常見解法&#xff1a;? 方法一&#xff1a;CSS aspect-ratio&…

如何搭建redis集群(docker方式非哨兵)

1、redis的配置文件這里要注意&#xff0c;主從的ip不需要我們去設置&#xff0c;只需要設置主從的密碼就可以&#xff0c;然后就是protect-mode&#xff0c;我設置的是no&#xff0c;一定注意不能設置主從。客戶端要訪問&#xff0c;一定要加# 每個節點的 redis.conf 中 clust…

如何學習VBA_3.3.9:利用“搭積木”思想,快速有效地完成你的代碼

我給VBA的定義&#xff1a;VBA是個人小型自動化處理的有效工具。利用好了&#xff0c;可以大大提高自己的勞動效率&#xff0c;而且可以提高數據處理的準確度。我推出的VBA系列教程共九套和一部VBA漢英手冊&#xff0c;現在已經全部完成&#xff0c;希望大家利用、學習。如果您…