C++二叉樹(shù)的直徑與合并詳解
二叉樹(shù)的直徑
- 給定一棵二叉樹(shù),你需要計(jì)算它的直徑長(zhǎng)度。一棵二叉樹(shù)的直徑長(zhǎng)度是任意兩個(gè)結(jié)點(diǎn)路徑長(zhǎng)度中的最大值。這條路徑可能穿過(guò)也可能不穿過(guò)根結(jié)點(diǎn)。
示例 :
給定二叉樹(shù)
返回 3, 它的長(zhǎng)度是路徑 [4,2,1,3] 或者 [5,2,1,3]。
思路
求左右孩子深度的和的最大值
/** * 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 res=0; //定義一個(gè)全局變量 int depth(TreeNode* root){ //求深度 if(root==nullptr) return 0; int L=depth(root->left); int R=depth(root->right); res=max(res,L+R); return max(L,R)+1; } int diameterOfBinaryTree(TreeNode* root) { depth(root); return res; } };
合并二叉樹(shù)
- 給定兩個(gè)二叉樹(shù),想象當(dāng)你將它們中的一個(gè)覆蓋到另一個(gè)上時(shí),兩個(gè)二叉樹(shù)的一些節(jié)點(diǎn)便會(huì)重疊。你需要將他們合并為一個(gè)新的二叉樹(shù)。合并的規(guī)則是如果兩個(gè)節(jié)點(diǎn)重疊,那么將他們的值相加作為節(jié)點(diǎn)合并后的新值,否則不為 NULL 的節(jié)點(diǎn)將直接作為新二叉樹(shù)的節(jié)點(diǎn)。
示例 1:
思路
1.確定遞歸函數(shù)的參數(shù)和返回值:
首先那么要合入兩個(gè)二叉樹(shù),那么參數(shù)至少是要傳入兩個(gè)二叉樹(shù)的根節(jié)點(diǎn),返回值就是合并之后二叉樹(shù)的根節(jié)點(diǎn)。
代碼如下:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)
2.確定終止條件:
因?yàn)槭莻魅肓藘蓚€(gè)樹(shù),那么就有兩個(gè)樹(shù)遍歷的節(jié)點(diǎn)t1 和 t2,如果t1 == NULL 了,兩個(gè)樹(shù)合并就應(yīng)該是 t2 了啊(如果t2也為NULL也無(wú)所謂,合并之后就是NULL)。
反過(guò)來(lái)如果t2 == NULL,那么兩個(gè)數(shù)合并就是t1(如果t1也為NULL也無(wú)所謂,合并之后就是NULL)。
代碼如下:
if (t1 == NULL) return t2; // 如果t1為空,合并之后就應(yīng)該是t2
if (t2 == NULL) return t1; // 如果t2為空,合并之后就應(yīng)該是t1
3.確定單層遞歸的邏輯:
單層遞歸的邏輯就比較好些了,這里我們用重復(fù)利用一下t1這個(gè)樹(shù),t1就是合并之后樹(shù)的根節(jié)點(diǎn)(就是修改了原來(lái)樹(shù)的結(jié)構(gòu))。
那么單層遞歸中,就要把兩棵樹(shù)的元素加到一起。
t1->val += t2->val;
接下來(lái)t1 的左子樹(shù)是:合并 t1左子樹(shù) t2左子樹(shù)之后的左子樹(shù)。
t1 的右子樹(shù):是 合并 t1右子樹(shù) t2右子樹(shù)之后的右子樹(shù)。
最終t1就是合并之后的根節(jié)點(diǎn)。
/** * 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* mergeTrees(TreeNode* root1, TreeNode* root2) { // 判空 if(root1==nullptr) return root2; if(root2==nullptr) return root1; // 修改了t1的數(shù)值和結(jié)構(gòu) root1->val+=root2->val; root1->left=mergeTrees(root1->left,root2->left); root1->right=mergeTrees(root1->right,root2->right); return root1; } };
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
簡(jiǎn)述C語(yǔ)言中system()函數(shù)與vfork()函數(shù)的使用方法
這篇文章主要介紹了簡(jiǎn)述C語(yǔ)言中system()函數(shù)與vfork()函數(shù)的使用方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08C++構(gòu)造函數(shù)的一些注意事項(xiàng)總結(jié)
構(gòu)造函數(shù)是創(chuàng)建類(lèi)對(duì)象,并且在創(chuàng)建完成前,對(duì)類(lèi)進(jìn)行初始化的特殊函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++構(gòu)造函數(shù)的一些注意事項(xiàng),需要的朋友可以參考下2021-11-11深入HRESULT與Windows Error Codes的區(qū)別詳解
本篇文章是對(duì)HRESULT與Windows Error Codes的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言驅(qū)動(dòng)開(kāi)發(fā)之內(nèi)核使用IO/DPC定時(shí)器詳解
本章將繼續(xù)探索驅(qū)動(dòng)開(kāi)發(fā)中的基礎(chǔ)部分,定時(shí)器在內(nèi)核中同樣很常用,在內(nèi)核中定時(shí)器可以使用兩種,即IO定時(shí)器,以及DPC定時(shí)器,感興趣的可以了解一下2023-04-04C/C++時(shí)間庫(kù)chrono的使用總結(jié)
std::chrono是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)組件,用于表示和處理時(shí)間,其功能就像是心理學(xué)中的感知系統(tǒng),它可以為我們捕捉、量化并操作抽象的時(shí)間概念,這就如同我們的大腦可以理解和感知周?chē)h(huán)境的時(shí)間流逝一樣,這種感知和理解能力是人類(lèi)進(jìn)行日?;顒?dòng)所必需的,2023-12-12C++ VTK實(shí)例之高斯隨機(jī)數(shù)的生成
這篇文章主要介紹了VTK的一個(gè)實(shí)例之高斯隨機(jī)數(shù)的生成,本文演示了從一個(gè)平均數(shù)是0.0和標(biāo)準(zhǔn)偏差是2.2的高斯分布中隨機(jī)生成3個(gè)隨機(jī)數(shù)。感興趣的同學(xué)可以學(xué)習(xí)一下2021-11-11