??目錄
一,單值二叉樹
題目詳情:
解法:父子比較法
解題思路:
思路實現(xiàn):
源代碼:
二,相同的樹
題目詳情:
解法:比較法
解題思路:
思路實現(xiàn):
源代碼:
三,翻轉(zhuǎn)二叉樹
解法:替換法
解題思路:
思路實現(xiàn):
源代碼:
一,單值二叉樹
題目詳情:
如果二叉樹每個節(jié)點都具有相同的值,那么該二叉樹就是單值二叉樹;
只有給定的樹是單值二叉樹時返回?true;否則返回?false;
提示:
1,給定樹的結(jié)點樹范圍是【1,100】
2,每個結(jié)點的值都是整數(shù),范圍為【0,99】
示例1:
輸入:nums = [1,1,1,1,1,NULL,1?]
輸出:true
示例2:
輸入:nums = [2,2,2,5,2]
輸出:false
解法:父子比較法
解題思路:
以上圖為例:要判斷根結(jié)點為(2)的二叉樹是否為單值二叉樹可以分解為(2)的左右子樹是否為單值二叉樹,這就很符合遞歸思路可以用遞歸解決;【(2)= 左子樹 && 右子樹】
判斷條件:
當(dāng)結(jié)點為NULL時返回 true ;
當(dāng)子結(jié)點存在時,并且與父親結(jié)點的值不相同時返回 false;
思路實現(xiàn):
首先要判空:
//判斷空
if(root==NULL)
{
return true;
}
?當(dāng)結(jié)點為空時不影響父親孩子之間的關(guān)系;
然后判斷孩子,父親之間的值的關(guān)系:
//判斷孩子與父親的值
if(root->left && root->val!=root->left->val)
{
return false;
}
if(root->right && root->val!=root->right->val)
{
return false;
}
?判斷孩子,父親所對應(yīng)的值是否相同;
大事化小:以上條件都滿足時,還需左右子樹是否為單值二叉樹,只有當(dāng)左右子樹都為單值二叉樹時才為 true;
//化為兩顆子樹是否為單值樹
return isUnivalTree(root->left) && isUnivalTree(root->right);
?要用邏輯與,需要雙方為真時才返回 true;
源代碼:
bool isUnivalTree(struct TreeNode* root){
//判斷空
if(root==NULL)
{
return true;
}
//判斷孩子與父親的值
if(root->left && root->val!=root->left->val)
{
return false;
}
if(root->right && root->val!=root->right->val)
{
return false;
}
//化為兩顆子樹是否為單值樹
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
我們可以用示例來演算一遍,流程也是這樣的;
像這種遞歸題目要演算其過程需要畫圖,這樣才是最直觀的;
二,相同的樹
題目詳情:
給你兩棵二叉樹的根結(jié)點?p 和 q?,編寫一個函數(shù)來檢驗這兩棵樹是否相同;
如果兩個樹在結(jié)構(gòu)上相同,并且結(jié)點具有相同的值,則認(rèn)為它們是相同的;
提示:
兩棵樹上的結(jié)點數(shù)目都在范圍【0,100】內(nèi)
-104<=Node.val<=10?
示例1:
輸入:p = [ 1,2,3 ],q = [ 1,2,3 ]
輸出:true
示例2:
輸入:p = [ 1,2 ],q = [ 1,2?]
輸出:false
示例3:
輸入:p = [ 1,2,1?],q = [ 1,2,2 ]
輸出:false
解法:比較法
解題思路:
要判斷兩棵樹是否一致,要考慮的是他們的結(jié)點是否都存在,結(jié)點對應(yīng)的值是否相同;
以上圖為例:根結(jié)點相同了,還要判斷其左右子樹是否也相同,然后層層往下,這道題也是用遞歸思想;
思路實現(xiàn):
首先要判斷他們的結(jié)點是否對應(yīng)存在:
//雙方都為空
if(p==NULL && q==NULL)
{
return true;
}
//一方為空另一方不為空
if((p==NULL || q==NULL)
{
return false;
}
當(dāng)雙方對應(yīng)的結(jié)點都為空時返回 true;
當(dāng)雙方對應(yīng)的結(jié)點只有一方為空,另一方不為空時,返回 false;
然后判斷它們對應(yīng)的結(jié)點的值的情況:
//判斷所對應(yīng)的值是否相同
if(p->val != q->val)
{
return false;
}
當(dāng)所對應(yīng)的值不相等則返回 false;
大事化?。?/strong>當(dāng)以上條件都滿足時,還需要判斷這兩棵樹所對應(yīng)的左右子樹是否相同;
//判斷其對應(yīng)的左右子樹是否也相同
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
源代碼:
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
//雙方都為空
if(p==NULL && q==NULL)
{
return true;
}
//一方為空另一方不為空
if((p==NULL || q==NULL)
{
return false;
}
//判斷所對應(yīng)的值是否相同
if(p->val != q->val)
{
return false;
}
//判斷其對應(yīng)的左右子樹是否也相同
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
這就是判斷兩顆二叉樹是否相同問題的解題思路了,還是利用遞歸;
三,翻轉(zhuǎn)二叉樹
題目詳情:
給你一棵二叉樹的根節(jié)點 root ,翻轉(zhuǎn)這棵二叉樹,并返回其根節(jié)點
示例1:
輸入:root = [ 4,2,7,1,3,6,9 ]
輸出:[ 4 7 2 9 6 3 1 ]
示例2:
輸入:root = [ 2,1,3 ]
輸出:[ 2,3,1]
示例3:
輸入:root = [ ]
輸出:[ ]
解法:替換法
解題思路:
翻轉(zhuǎn)翻轉(zhuǎn)所謂翻轉(zhuǎn)其實就是將左右子樹換個位置而已,直接將其交換,層層交換下去直至NULL,用遞歸來實現(xiàn);
思路實現(xiàn):
首先還是判空,如果為空直接返回NULL即可;
然后直接交換左,右子樹,再讓其左,右子樹也如此下去,就完成了對整顆樹的翻轉(zhuǎn)了,在返回根結(jié)點即可;
源代碼:
void swap(struct TreeNode** left,struct TreeNode** right)
{
struct TreeNode* tmp=*left;
*left=*right;
*right=tmp;
}
struct TreeNode* invertTree(struct TreeNode* root){
//判空
if(root==NULL)
{
return NULL;
}
//交換
swap(&root->left,&root->right);
//左子樹翻轉(zhuǎn)
invertTree(root->left);
//右子樹翻轉(zhuǎn)
invertTree(root->right);
return root;
}
基本上與二叉樹相關(guān)的練習(xí)都要使用遞歸思想,前期培養(yǎng)遞歸思路最好就是畫圖解析,這個很重要,畫圖能讓我們更直觀的感受結(jié)點之間的關(guān)系,特別是感受那個返回的過程領(lǐng)悟其中的奧妙,久而久之我們對于遞歸的思路就更加清晰了,不至于摸不著北;
第五階段就到這里了,這階段帶大家刷道些題目來感受一下二叉樹的魅力!
后面博主會陸續(xù)更新;
如有不足之處歡迎來補充交流!文章來源:http://www.zghlxwxcb.cn/news/detail-725687.html
完結(jié)。。文章來源地址http://www.zghlxwxcb.cn/news/detail-725687.html
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】單值二叉樹 & 相同的樹 & 翻轉(zhuǎn)二叉樹(五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!