判斷兩顆二叉樹(shù)是否相似的兩種方法
名稱:判斷兩個(gè)二叉樹(shù)是否相似
說(shuō)明:此處的兩個(gè)方法一個(gè)是非遞歸,一個(gè)是遞歸算法。其實(shí)兩個(gè)算法的本質(zhì)思路是一樣的就是,判斷位置相同的兩個(gè)結(jié)點(diǎn)是否同時(shí)為空或同時(shí)不為空。只是具體的實(shí)現(xiàn)不一樣。
對(duì)于層次遍歷法:此處不小心用錯(cuò)了,本應(yīng)該用隊(duì)列來(lái)當(dāng)作排列下一層元素的。歪打正著,此處用棧也可以,只是判斷的結(jié)點(diǎn)順序不一樣。隊(duì)列的話,是從每一層的左端到右端。棧的話,是從右端到左端。在此處都沒(méi)影響。我去,有發(fā)現(xiàn)一點(diǎn),要從右到左訪問(wèn)一層的元素的話,應(yīng)該用棧。
對(duì)于遞歸,看起來(lái)比非遞歸要簡(jiǎn)單不少?;镜乃悸泛芎?jiǎn)單,要注意的是,在程序需要從子樹(shù)接收返回是否相似的信息。這樣的話,有一個(gè)問(wèn)題,就是必須等樹(shù)完全判斷完才可以最終返回。不想上面的,過(guò)程中發(fā)現(xiàn)不一樣就可以立即返回了。
//層次遍歷法判斷兩棵樹(shù)是否相似
bool IsSemblable1(BiTree T1,BiTree T2)
{
stack<BiTNode* > _sta1,_sta2; //用來(lái)存放下一層元素的容器,此處棧和隊(duì)列都行
BiTNode *p1 = T1,*p2 = T2; //p1用來(lái)跟蹤T1,p2用來(lái)跟蹤T2
while((_sta1.empty() == false || p1 != NULL) &&(_sta2.empty() == false || p2 != NULL))
{
if(p1 != NULL && p2 != NULL ) //如果p1和p2都不為空時(shí)
{
if(p1->lchild != NULL && p2->lchild != NULL) //如果p1和p2的左子樹(shù)都不為空時(shí)
{
_sta1.push(p1->lchild);
_sta2.push(p2->lchild);
}
else if( p1->lchild != NULL || p2->lchild != NULL) //如果p1的左子樹(shù)為空,但是p2的左子樹(shù)不為空,或者相反
return false;
if(p1->rchild != NULL && p2->rchild != NULL) //如果p1和p2的右子樹(shù)都不為空時(shí)
{
_sta1.push(p1->rchild);
_sta2.push(p2->rchild);
}
else if(p1->rchild != NULL || p2->rchild != NULL) //如果p1的右子樹(shù)為空,但是p2的右子樹(shù)不為空,或者相反
return false;
//訪問(wèn)完兩棵樹(shù)的當(dāng)前結(jié)點(diǎn)后,置空讓下一次循環(huán)彈出棧中元素(此處其實(shí)直接彈出元素也行)
p1 = NULL;
p2 = NULL;
}
else if(p1 != NULL || p2 != NULL) //當(dāng)前節(jié)點(diǎn)有一個(gè)為空
return false;
else
{
//彈出兩個(gè)樹(shù)的棧頂元素
p1 = _sta1.top();
p2 = _sta2.top();
_sta1.pop();
_sta2.pop();
}
}
return true;
}
//遞歸判斷兩棵樹(shù)是否相似
bool IsSemblable2(BiTree T1,BiTree T2)
{
bool leftS = false,rightS = false; //用來(lái)接受子樹(shù)返回的信息
if(T1 == NULL && T2 == NULL) //兩個(gè)結(jié)點(diǎn)都為空
return true;
else if(T1 == NULL || T2 == NULL) //有一個(gè)結(jié)點(diǎn)不為空
return false;
else
{
int leftS = IsSemblable2(T1->lchild,T2->lchild); //遞歸左子樹(shù)
int rightS = IsSemblable2(T1->rchild,T2->rchild); //遞歸右子樹(shù)
return leftS && rightS ; //返回兩個(gè)子樹(shù)的信息
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- C語(yǔ)言二維數(shù)組幾種常用的表示方法
- C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
- C語(yǔ)言項(xiàng)目爬樓梯的兩種實(shí)現(xiàn)方法參考
- C語(yǔ)言程序打豆豆(函數(shù)版)
- 劍指offer之C語(yǔ)言不修改數(shù)組找出重復(fù)的數(shù)字
- C語(yǔ)言測(cè)試n的階乘和x的n次方
- C語(yǔ)言數(shù)組a和&a的區(qū)別講解
- C語(yǔ)言實(shí)現(xiàn)詞法分析器
- C++稀疏矩陣的各種基本運(yùn)算并實(shí)現(xiàn)加法乘法
- Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑
相關(guān)文章
C++日期類(lèi)計(jì)算器的模擬實(shí)現(xiàn)舉例詳解
兩個(gè)日期之間相隔天數(shù)的計(jì)算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語(yǔ)言來(lái)完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類(lèi)計(jì)算器的模擬實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)進(jìn)階之棧和隊(duì)列的實(shí)現(xiàn)
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2021-11-11
VC++中HTControl的CHTButton按鈕控件類(lèi)用法實(shí)例解析
這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類(lèi)用法,對(duì)于大家進(jìn)行VC++項(xiàng)目開(kāi)發(fā)有一定的幫助作用,需要的朋友可以參考下2014-08-08
C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法
本文主要介紹了C++中實(shí)現(xiàn)fibonacci數(shù)列的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

