劍指Offer(數據結構與算法面試題精講)C++版——day16

劍指Offer(數據結構與算法面試題精講)C++版——day16

      • 題目一:序列化和反序列化二叉樹
      • 題目二:從根節點到葉節點的路徑數字之和
      • 題目三:向下的路徑節點值之和
      • 附錄:源碼gitee倉庫

題目一:序列化和反序列化二叉樹

????題目:如圖8.3所示,請設計一個算法將二叉樹序列化成一個字符串,并能將該字符串反序列化出原來二叉樹的算法。
在這里插入圖片描述????這里考查的其實是二叉樹的創建和輸出,只需要固定使用前序、中序或者后序遍歷即可,比如構建二叉樹的時候使用前序遍歷,在進行反序列化的時候同樣使用前序遍歷的方式輸出。由于這里需要反序列化為字符串,使用#標識空節點,因此二叉樹的數據類型使用char類型。考慮到需要使用參數的形式去序列化構建一顆二叉樹,這里使用輸入的流的形式不太方便,分析發現可以使用一個隊列結構,將需要字符串讀入到隊列中,然后采用引用類型調用這個存儲了字符的隊列來構建二叉樹,這樣就能夠實現字符串序列化成一顆二叉樹,最終可以得到如下代碼:

treeNode* createTree(queue<char>& qu) {char val=qu.front();qu.pop();if(val=='#') {return nullptr;} else {treeNode* node=new treeNode(val);node->left=createTree(qu);node->right=createTree(qu);return node;}
}
treeNode* deserialize(string data) {queue<char> qu;for(int i=0,size=data.length(); i<size; ++i) {qu.push(data[i]);}return createTree(qu);
}
void serialize(treeNode* tree) {treeNode * p=tree;if(p==nullptr) {cout<<"#";return;} else {cout<<p->val;serialize(p->left);serialize(p->right);}
}

在這里插入圖片描述

題目二:從根節點到葉節點的路徑數字之和

????題目:在一棵二叉樹中所有節點都在0~9的范圍之內,從根節點到葉節點的路徑表示一個數字。求二叉樹中所有路徑表示的數字之和。例如,圖8.4的二叉樹有3條從根節點到葉節點的路徑,它們分別表示數字395、391和302,這3個數字之和是1088。
在這里插入圖片描述
????由于需要統計從根節點到葉子節點路徑數字和,那么需要拿到所有根節點到葉子節點的路徑。我們還能夠發現,這里可以考慮使用遞歸來簡化代碼邏輯,以395這條路徑為例,拿到3節點之后,相當于需要得到以9節點和0節點為根節點到葉子節點的和,這里存在一種數值關系,原根節點到葉子節點的和=上一級*10+下一級節點(新根節點)的路徑和。
????接下來,分析如何拿到根節點到葉子節點的所有路徑,從根節點向下一級節點探索,每次都需要探索左子節點和右子節點,這里立刻會想到前序遍歷,當前序遍歷拿到最后一個節點,即葉子節點,那么說明路徑完整了,這時候終止前面提到的上一級*10+下一級節點(新根節點)的路徑和這一遍歷過程。于是得到如下代碼:

int dfs(treeNode* tree,int path) {if(tree==nullptr) {return 0;}path=path*10+tree->val;if(!tree->left&&!tree->right) {return path;}return dfs(tree->left,path)+dfs(tree->right,path);
}int getAllPathSum(treeNode* tree) {return dfs(tree,0);
}

????這里的代碼將遞推關系和前序遍歷巧妙的結合起來,這里再回過頭捋一下思路,由于發現可以使用遞歸的形式計算下層根節點到葉子節點的值,因此可以整體上使用dfs(tree->left)+dfs(tree->right)的形式實現,遞歸的出口有兩個:
(1)一開始樹就為空,或者子樹左右兩邊中一邊為空;
(2)遞歸掃描到了葉子節點;
????為了保證每次path值都能帶入之后的計算,所以使用參數dfs傳參的方式向后傳遞,這里巧妙的是利用dfs(tree,0)開啟掃描,讓入口和接下來的遍歷遞推關系統一起來。

題目三:向下的路徑節點值之和

????題目:給定一棵二叉樹和一個值sum,求二叉樹中節點值之和等于sum的路徑的數目。路徑的定義為二叉樹中順著指向子節點的指針向下移動所經過的節點,但不一定從根節點開始,也不一定到葉節點結束。例如,在如圖8.5所示中的二叉樹中有兩條路徑的節點值之和等于8,其中,第1條路徑從節點5開始經過節點2到達節點1,第2條路徑從節點2開始到節點6。
在這里插入圖片描述
????結合上一題的思路,這里同樣是需要使用先根節點、然后左孩子、右孩子的先序深度遍歷,區別在于這里的path值計算不一致,前面是用位數統計,這里只需要統計和。由于題意中描述說這里不僅僅需要考慮到跟到葉子節點的可能路徑數,還需要考慮到中間節點到其余節點的可能值,因此既需要考慮攜帶path向后遞歸,又需要考慮不攜帶path從新節點觸發的可能路徑數。還有一種情況需要考慮,在圖的深度優先遍歷時,我們常常需要考慮剪枝,這里由于沒有說明每個節點的數值是多少(沒有說每個節點的數值都是正數),因此不能提前找到路徑就終止遞歸。于是得到如下代碼:

void dfs(treeNode* tree,int path,int sum,int& count) {if(tree==nullptr) {return;}path=path+tree->val;if(path==sum) {count++;}if(!tree->left&&!tree->right) {return;}dfs(tree->left,path,sum,count);//攜帶傳值dfs(tree->right,path,sum,count);dfs(tree->left,0,sum,count);//不攜帶傳值dfs(tree->right,0,sum,count);
}

在這里插入圖片描述
????這里可以得到一下總結,在使用遞歸的時候,需要明確如下幾點:
(1)遞歸入口以及進入遞歸的方式;
(2)遞歸出口;
(3)遞歸的遞推方式;
????對于統計可以視情況使用引用類型參數,比如這里巧妙的利用count引用類型實現統計所有路徑。

附錄:源碼gitee倉庫

????考慮到有些算法需要模擬數據,如果全部放進來代碼顯得過長,不利于聚焦在算法的核心思路上。于是把所有的代碼整理到了開源倉庫上,如果想要看詳細模擬數據,可在開源倉庫自取:【凌空暗羽/劍指Offer-C++版手寫代碼】。

????我是【Jerry說前后端】,本系列精心挑選的算法題目均基于經典的《劍指 Offer(數據結構與算法面試題精講)》。在如今競爭激烈的技術求職環境下,算法能力已成為前端開發崗位筆試考核的關鍵要點。通過深入鉆研這一系列算法題,大家能夠系統地積累算法知識和解題經驗。每一道題目的分析與解答過程,都像是一把鑰匙,為大家打開一扇通往高效編程思維的大門,幫助大家逐步提升自己在數據結構運用、算法設計與優化等方面的能力。
????無論是即將踏入職場的應屆畢業生,還是想要進一步提升自身技術水平的在職開發者,掌握扎實的算法知識都是提升競爭力的有力武器。希望大家能跟隨我的步伐,在這個系列中不斷學習、不斷進步,為即將到來的前端筆試做好充分準備,順利拿下心儀的工作機會!快來訂閱吧,讓我們一起開啟這段算法學習之旅!

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

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

相關文章

OpenCV 模板與多個對象匹配方法詳解(繼OpenCV 模板匹配方法詳解)

文章目錄 前言1.導入庫2.圖片預處理3.輸出模板圖片的寬和高4.模板匹配5.獲取匹配結果中所有符合閾值的點的坐標5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍歷所有匹配點6.1 loc 的結構回顧6.2 loc[::-1] 的作用6.2.1 為什么需要反轉…

產品經理學習過程

一&#xff1a;掃盲篇&#xff08;初始產品經理&#xff09; 階段1&#xff1a;了解產品經理 了解產品經理是做什么的、產品經理的分類、產品經理在實際工作中都會接觸什么樣的崗位、以及產品經理在實際工作中具體要做什么事情。 二&#xff1a;準備篇 階段2&#xff1a;工…

【消息隊列RocketMQ】一、RocketMQ入門核心概念與架構解析

在當今互聯網技術飛速發展的時代&#xff0c;分布式系統的架構設計愈發復雜。消息隊列作為分布式系統中重要的組件&#xff0c;在解耦應用、異步處理、削峰填谷等方面發揮著關鍵作用。RocketMQ 作為一款高性能、高可靠的分布式消息中間件&#xff0c;被廣泛應用于各類互聯網場景…

從“鏈主”到“全鏈”:供應鏈數字化轉型的底層邏輯

1. 制造業與供應鏈數字化轉型的必然性 1.1. 核心概念與戰略重要性 制造業的數字化轉型&#xff0c;是利用新一代數字技術&#xff08;如工業互聯網、人工智能、大數據、云計算、邊緣計算等&#xff09;對制造業的整體價值鏈進行根本性重塑的過程。這不僅涉及技術的應用&#…

x-ui重新申請ssl證書失敗

由于某些需要我們重新申請ssl證書&#xff0c;x-ui自動化腳本不能強制更新&#xff0c;根據x-ui倉庫源碼&#xff1a; https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申請ssl證書的地方稍作修改&#xff0c;得到&#xff0c;運行下面的腳本就可以重新申請ssl證書&#…

Java NIO Java 虛擬線程(微線程)與 Go 協程的運行原理不同 為何Go 能在低配機器上承接10萬 Websocket 協議連接

什么是Java NIO&#xff1f; Java NIO&#xff08;New Input/Output&#xff09; 是Java 1.4&#xff08;2002年&#xff09;引入的一種非阻塞、面向緩沖區的輸入輸出框架&#xff0c;旨在提升Java在高性能和高并發場景下的I/O處理能力。它相比傳統的 Java IO&#xff08;java…

go環境安裝mac

下載go安裝包&#xff1a;https://golang.google.cn/dl/ 找到對應自己環境的版本下載。 注意有二進制的包&#xff0c;也有圖形界面安裝的包。圖形界面直接傻瓜式點就行了。 二進制的按照下面操作&#xff1a; 1、下載二進制包。 2、將下載的二進制包解壓至 /usr/local目錄…

LVGL源碼(9):學會控件的使用(自定義彈窗)

LVGL版本&#xff1a;8.3 LVGL的控件各式各樣&#xff0c;每種控件都有自己的一些特性&#xff0c;當我們想要使用一個LVGL控件時&#xff0c;我們首先可以通過官網去了解控件的一些基本特性&#xff0c;官網鏈接如下&#xff1a; LVGL Basics — LVGL documentation&#xf…

《軟件設計師》復習筆記(1)——考試介紹【新】

目錄 一、考試介紹 證書價值 考試要求 二、【新】計算機與軟件工程知識 三、軟件設計 一、考試介紹 >考試科目>考題形式>考試時長>合格標準計算機與軟件工程知識75道單選題&#xff08;每題1分&#xff0c;總分75分&#xff09;2023年11月改革機試后&#…

MCU中的BSS和data都占用SRAM空間嗎?

在MCU中&#xff0c;BSS段和data段都占用SRAM空間&#xff0c;但它們的存儲方式和用途有所不同。? BSS段 BSS段&#xff08;Block Started by Symbol&#xff09;用于存儲未初始化的全局變量和靜態變量。這些變量在程序啟動時會被清零&#xff0c;因此它們不占用Flash空間&a…

Ubuntu 22.04 更換 Nvidia 顯卡后啟動無法進入桌面問題的解決

原顯卡為 R7 240, 更換為 3060Ti 后, 開機進桌面時卡在了黑屏界面, 鍵盤有反應, 但是無法進入 shell. 解決方案為 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 啟動后在開機菜單中(如果沒有開機菜單, 需要按shift鍵), 進入recove…

Python爬蟲-爬取貓眼演出數據

前言 本文是該專欄的第53篇,后面會持續分享python爬蟲干貨知識,記得關注。 貓眼平臺除了有影院信息之外,它還涵蓋了演出信息,比如說“演唱會,音樂節,話劇音樂劇,脫口秀,音樂會,戲曲藝術,相聲”等等各種演出相關信息。 而本文,筆者將以貓眼平臺為例,基于Python爬蟲…

人工智能-機器學習(線性回歸,邏輯回歸,聚類)

人工智能概述 人工智能分為:符號學習&#xff0c;機器學習。 機器學習是實現人工智能的一種方法&#xff0c;深度學習是實現機器學習的一種技術。 機器學習&#xff1a;使用算法來解析數據&#xff0c;從中學習&#xff0c;然后對真實世界中是事務進行決策和預測。如垃圾郵件檢…

FPGA學習(五)——DDS信號發生器設計

FPGA學習(五)——DDS信號發生器設計 目錄 FPGA學習(五)——DDS信號發生器設計一、FPGA開發中常用IP核——ROM/RAM/FIFO1、ROM簡介2、ROM文件的設置&#xff08;1&#xff09;直接編輯法&#xff08;2&#xff09;用C語言等軟件生成初始化文件 3、ROM IP核配置調用 二、DDS信號發…

【Vue】從 MVC 到 MVVM:前端架構演變與 Vue 的實踐之路

個人博客&#xff1a;haichenyi.com。感謝關注 一. 目錄 一–目錄二–架構模式的演變背景?三–MVC&#xff1a;經典的分層起點?四–MVP&#xff1a;面向接口的解耦嘗試?五–MVVM&#xff1a;數據驅動的終極形態??六–Vue&#xff1a;MVVM 的現代化實踐??? 二. 架構模…

【算法】快速排序、歸并排序(非遞歸版)

目錄 一、快速排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、歸并排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…