左葉子之和 找左下角的值 路徑總和

1.計算給定二叉樹的所有左葉子之和。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
?? ?int val;
?? ?TreeNode* left;
?? ?TreeNode* right;
?? ?TreeNode(int x)
?? ?{
?? ??? ?val=x;
?? ??? ?left=NULL;
?? ??? ?right=NULL;
?? ?}
};
int findsum(TreeNode* root)
{
?? ?if(root==NULL)
?? ?return 0;
?? ?if(root->left==NULL&&root->right==NULL)
?? ?return 0;
?? ?int leftnum=findsum(root->left);
?? ?if(root->left&&!root->left->left&&!root->left->right)
?? ?{
?? ??? ?leftnum=root->left->val;
?? ?}
?? ?int rightnum=findsum(root->right);
?? ?int sum=leftnum+rightnum;
?? ?return sum;?? ?
}
int main()
{
?? ?TreeNode* root=new TreeNode(1);
?? ?root->left=new TreeNode(2);
?? ?root->right=new TreeNode(3);
?? ?root->left->left=new TreeNode(4);
?? ?root->left->right=new TreeNode(6);
?? ?root->left->right->right=new TreeNode(7);
?? ?root->right->left=new TreeNode(5);
?? ?int sum=findsum(root);
?? ?cout<<sum;
?? ?return 0;
}

思路:首先我們要搞清楚左葉子,即左右子樹的左側葉子結點,特征就是沒有左右孩子,且在父結點的左側,另外在判斷左葉子時我們只能借助于父結點,因為在遍歷到葉子結點時我們無法判斷其是左葉子還是右葉子,在這里我們就用到后序遍歷,通過遞歸函數的返回值來累加求取左葉子數值之和。

當結點為空時,左葉子一定是0,當為葉子結點時左葉子也是0,只有當遍歷到父結點且其含有左葉子時,返回其值。

2.給定一個二叉樹,在樹的最后一行找到最左邊的值。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
?? ?int val;
?? ?TreeNode* left;
?? ?TreeNode* right;
?? ?TreeNode(int x)
?? ?{
?? ??? ?val=x;
?? ??? ?left=NULL;
?? ??? ?right=NULL;
?? ?}
};
int findValue(TreeNode* root)
{
?? ?queue<TreeNode*> que;
? ? int result=0;
? ? if(root!=NULL)
? ? {
? ? ? ? que.push(root);
? ? }
?? ?while(!que.empty())
? ? {
? ? ? ? int size=que.size();
?? ??? ?for(int i=0;i<que.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;
}
int main()
{
?? ?TreeNode* root=new TreeNode(1);
?? ?root->left=new TreeNode(2);
?? ?root->right=new TreeNode(3);
?? ?root->left->left=new TreeNode(4);
?? ?root->left->right=new TreeNode(6);
?? ?root->left->right->right=new TreeNode(7);
?? ?root->right->left=new TreeNode(5);
?? ?cout<<findValue(root);
?? ?return 0;
}

思路:這道題的左下角的值我們要知道指的是深度最大的那一行的最左側的值,那么其實不找深度最大的一行的第一個元素就行了,因而層序遍歷顯得比較適合。

層序遍歷之前已經提到過就不多贅述了,就只是在此基礎上修改了一小部分,就是取每一層的第一個元素給result,會逐層覆蓋,最終輸出的就是最后一層的第一個元素了。

3.給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等于目標和。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
?? ?int val;
?? ?TreeNode* left;
?? ?TreeNode* right;
?? ?TreeNode(int x)
?? ?{
?? ??? ?val=x;
?? ??? ?left=NULL;
?? ??? ?right=NULL;
?? ?}
};
bool isGoal(TreeNode* root,int target)
{
?? ?if(root->left==NULL&&root->right==NULL&&target==0)
?? ?return true;
?? ?if(root->left==NULL&&root->right==NULL&&target!=0)
?? ?return false;
?? ?if(root->left)
?? ?{
?? ??? ?target-=root->left->val;
?? ??? ?if(isGoal(root->left,target))
?? ??? ?return true;
?? ??? ?target+=root->left->val;
?? ? }?
?? ?if(root->right)
?? ?{
?? ??? ?target-=root->right->val;
?? ??? ?if(isGoal(root->right,target))
?? ??? ?return true;
?? ??? ?target+=root->right->val;
?? ?}
?? ?return false;
?? ?
?}?
bool hasPathSum(TreeNode* root,int sum)
{
?? ?if(root==NULL)
?? ?return false;
?? ?return isGoal(root,sum-root->val);
}
int main()
{
?? ?TreeNode* root=new TreeNode(1);
?? ?root->left=new TreeNode(2);
?? ?root->right=new TreeNode(3);
?? ?root->left->left=new TreeNode(7);
?? ?root->left->right=new TreeNode(5);
?? ?cout<<((hasPathSum(root,10)==1)?"true":"false");
?? ?return 0;
}
思路:這里我們可以這樣想,開始遍歷時,將目標值target傳入,如果存在根節點就先用target減去其val值,先遍歷左子樹,此時遍歷到根節點時減去其左子樹的值,之后每遍歷一個左節點就繼續減去它的左子樹的值,直到葉子節點時,如果此時target為0,那么就說明存有路徑和為target,返回true,否則就進行回溯,將target回復原來的值轉而向另外的路徑探索看是否存有這樣的路徑,遍歷右子樹也是如此,注意這里我們如果找到了符合的路徑,但仍未遍歷完整棵樹,也是直接返回true,不必繼續遍歷。


?

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

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

相關文章

Matlab實現RIME-CNN-LSTM-Multihead-Attention多變量多步時序預測

SCI一區級 | Matlab實現RIME-CNN-LSTM-Multihead-Attention多變量多步時序預測 目錄 SCI一區級 | Matlab實現RIME-CNN-LSTM-Multihead-Attention多變量多步時序預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.Matlab實現RIME-CNN-LSTM-Multihead-Attention霜冰算法…

996引擎-自定義屬性-方法2:setitemcustomabil

996引擎-自定義屬性-方法2:setitemcustomabil 先看下效果測試NPC補全測試代碼輔助表公式setitemcustomabil 總結參考資料先看下效果 測試NPC 為了方便測試,先準備個NPC require("Envir/QuestDiary/ex/init.lua"); require("Envir/QuestDiary/utils/init.lu…

蘋果電腦殺毒軟件CleanMyMac

殺毒軟件在蘋果家族中是一個小眾軟件&#xff0c;百度搜索蘋果電腦殺毒軟件&#xff0c;可能各種殺軟良莠不齊&#xff0c;因為在這個市場非常小&#xff0c;絕大多數都是沖著“清理”去的&#xff0c;而不是殺毒。最近測試了一款Mac電腦殺毒軟件&#xff0c;殺毒效果也是一般般…

pandas表格內容比較

前陣子來了一個211大學實習生&#xff08;小男生&#xff09;&#xff0c;要比較2個版本字段的變化&#xff0c;輔助完成系統升級字段替換&#xff0c;要求找出哪些字段是新增的&#xff0c;哪些字段是刪除的&#xff0c;哪些字段是屬性信息修改的&#xff0c;要求半天時間搞定…

【SpringBoot】最佳實踐——JWT結合Redis實現雙Token無感刷新

JWT概覽 JWT概念 JWT是全稱是JSON WEB TOKEN&#xff0c;是一個開放標準&#xff0c;用于將各方數據信息作為JSON格式進行對象傳遞&#xff0c;可以對數據進行可選的數字加密&#xff0c;可使用RSA或ECDSA進行公鑰/私鑰簽名。JWT最常見的使用場景就是緩存當前用戶登錄信息&am…

面試系列|螞蟻金服技術面【1】

哈嘍&#xff0c;大家好&#xff01;今天分享一下螞蟻金服的 Java 后端開發崗位真實社招面經&#xff0c;復盤面試過程中踩過的坑&#xff0c;整理面試過程中提到的知識點&#xff0c;希望能給正在準備面試的你一些參考和啟發&#xff0c;希望對你有幫助&#xff0c;愿你能夠獲…

eBPF 實時捕獲鍵盤輸入

eBPF 實時捕獲鍵盤輸入 本文將帶你一步步實現一個基于eBPF kprobe的鍵盤記錄功能&#xff0c;通過Go語言配合libbpfgo&#xff0c;你將學會如何無損地監控系統鍵盤輸入&#xff0c;并從中獲取實時數據&#xff0c;進一步提高系統安全和監控能力。 1. 說明 本文屬于專欄 Go語言…

APB-清華聯合騰訊等機構推出的分布式長上下文推理框架

APB (Accelerating Distributed Long-Context Inference by Passing Compressed Context Blocks acrossGPUs)是清華大學等機構聯合提出的分布式長上下文推理框架。通過稀疏注意力機制和序列并行推理方式&#xff0c;有效解決了大模型處理長文本時的效率瓶頸。APB采用更小的Anch…

數據庫分庫分表介紹

分庫分表是解決數據庫性能瓶頸的常用技術手段&#xff0c;主要用于應對數據量過大、讀寫壓力過高的問題。通過將數據分散到多個數據庫或表中&#xff0c;可以提高系統的擴展性和性能。 1. 分庫分表的核心概念 &#xff08;1&#xff09;分庫 定義&#xff1a;將數據分散到多個…

#mapreduce打包#maven:could not resolve dependencies for project

打包報錯&#xff1a; #報錯信息&#xff1a; [ERROR] Failed to execute goal on project mapreduce_teacher1: Could not resolve dependencies for project org.example:mapreduce_teacher1:jar:1.0-SNAPSHOT: Failed to collect dependencies at org.apache.hive:hive-exe…

Rabit

之前發過rabit了&#xff0c;所以這里不再贅述&#xff0c;講講原理 在線Rabbit加密 | Rabbit解密- 在線工具 (sojson.com) rabbit加密原理 Rabbit加密算法是一種流密碼算法&#xff0c;由Daniel J. Bernstein設計&#xff0c;并被廣泛用于多種加密和安全通信應用中。它的設…

【A2DP】深入解讀A2DP中通用訪問配置文件(GAP)的互操作性要求

目錄 一、模式支持要求 1.1 發現模式 1.2 連接模式 1.3 綁定模式 1.4 模式間依賴關系總結 1.5 注意事項 1.6 協議設計深層邏輯 二、安全機制&#xff08;Security Aspects&#xff09; 三、空閑模式操作&#xff08;Idle Mode Procedures&#xff09; 3.1 支持要求 …

模型蒸餾系列——開源項目

推薦項目&#xff1a;MiniMind&#xff08;低成本全流程訓練框架&#xff09; GitHub&#xff1a;https://github.com/jingyaogong/minimind 核心特性&#xff1a;完整實現從數據清洗到模型部署的全流程&#xff0c;支持單卡低成本訓練&#xff0c;代碼全透明&#xff0c;適合…

【軟考-架構】13.1、軟件架構概述-構件技術

?資料&文章更新? GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目錄 ?【重點】系統架構設計軟件架構概述軟件架構設計與生命周期構件&#x1f31f;軟件架構風格數據流風格調用/返回風格獨立構件風格虛擬機風格倉庫風格閉環控制風格C2體系結…

《Android啟動偵探團:追蹤Launcher啟動的“最后一公里”》

1. 開機儀式的“黑屏懸案” 當Android設備完成開機動畫后&#xff0c;某些產品會陷入詭異的“黑屏時刻”——仿佛系統在玩捉迷藏。此時&#xff0c;**Launcher&#xff08;桌面&#xff09;**就是躲貓貓的主角。我們的任務&#xff1a;揪出Launcher何時完成啟動&#xff0c;終…

Redis事務與管道

Redis事務 可以一次執行多個命令&#xff0c;本質是一組命令的集合。一個事務中的所有命令都會序列化&#xff0c;按順序地串行執行而不會被其他命令插入&#xff0c;不許加塞。 一個隊列中&#xff0c;一次性、順序性、排他性的執行一系列命令。 Redis事務VS數據庫事務 常用…

掌握這些 UI 交互設計原則,提升產品易用性

在當今數字化時代&#xff0c;用戶對于產品的體驗要求越來越高&#xff0c;UI 交互設計成為決定產品成敗的關鍵因素之一。一個易用的產品能夠讓用戶輕松、高效地完成各種操作&#xff0c;而實現這一目標的核心在于遵循一系列科學合理的 UI 交互設計原則。本文將詳細闡述簡潔性、…

Alembic 實戰指南:快速入門到FastAPI 集成

一、快速開始 1.1 簡介 Alembic 是一個基于 SQLAlchemy 的數據庫遷移工具&#xff0c;主要用于管理數據庫模式&#xff08;Schema&#xff09;的變更&#xff0c;例如新增表、修改字段、刪除索引等&#xff0c;確保數據庫結構與應用程序的 ORM 模型保持一致。 Alembic 通過版…

LRU(最近最少使用)算法實現

核心思想與基本思路 LRU&#xff08;Least Recently Used&#xff09;算法是一種緩存淘汰策略&#xff0c;其核心思想是淘汰最近最少使用的數據。 最近使用原則&#xff1a;最近被訪問的數據在未來被訪問的概率更高&#xff0c;因此應保留在緩存中。淘汰機制&#xff1a;當緩…

現在有分段、句子數量可能不一致的中英文文本,如何用python實現中英文對照翻譯(即每行英文對應相應的中文)

以下是處理分段且中英文句子數量可能不一致的文本的Python實現方案&#xff0c;包含分句、翻譯和對齊功能&#xff1a; from googletrans import Translator import redef split_paragraphs(text):"""按空行分割段落并清洗"""return [p.strip()…