判斷兩顆二叉樹是否相似的兩種方法
名稱:判斷兩個二叉樹是否相似
說明:此處的兩個方法一個是非遞歸,一個是遞歸算法。其實兩個算法的本質(zhì)思路是一樣的就是,判斷位置相同的兩個結(jié)點是否同時為空或同時不為空。只是具體的實現(xiàn)不一樣。
對于層次遍歷法:此處不小心用錯了,本應(yīng)該用隊列來當(dāng)作排列下一層元素的。歪打正著,此處用棧也可以,只是判斷的結(jié)點順序不一樣。隊列的話,是從每一層的左端到右端。棧的話,是從右端到左端。在此處都沒影響。我去,有發(fā)現(xiàn)一點,要從右到左訪問一層的元素的話,應(yīng)該用棧。
對于遞歸,看起來比非遞歸要簡單不少?;镜乃悸泛芎唵?,要注意的是,在程序需要從子樹接收返回是否相似的信息。這樣的話,有一個問題,就是必須等樹完全判斷完才可以最終返回。不想上面的,過程中發(fā)現(xiàn)不一樣就可以立即返回了。
//層次遍歷法判斷兩棵樹是否相似
bool IsSemblable1(BiTree T1,BiTree T2)
{
stack<BiTNode* > _sta1,_sta2; //用來存放下一層元素的容器,此處棧和隊列都行
BiTNode *p1 = T1,*p2 = T2; //p1用來跟蹤T1,p2用來跟蹤T2
while((_sta1.empty() == false || p1 != NULL) &&(_sta2.empty() == false || p2 != NULL))
{
if(p1 != NULL && p2 != NULL ) //如果p1和p2都不為空時
{
if(p1->lchild != NULL && p2->lchild != NULL) //如果p1和p2的左子樹都不為空時
{
_sta1.push(p1->lchild);
_sta2.push(p2->lchild);
}
else if( p1->lchild != NULL || p2->lchild != NULL) //如果p1的左子樹為空,但是p2的左子樹不為空,或者相反
return false;
if(p1->rchild != NULL && p2->rchild != NULL) //如果p1和p2的右子樹都不為空時
{
_sta1.push(p1->rchild);
_sta2.push(p2->rchild);
}
else if(p1->rchild != NULL || p2->rchild != NULL) //如果p1的右子樹為空,但是p2的右子樹不為空,或者相反
return false;
//訪問完兩棵樹的當(dāng)前結(jié)點后,置空讓下一次循環(huán)彈出棧中元素(此處其實直接彈出元素也行)
p1 = NULL;
p2 = NULL;
}
else if(p1 != NULL || p2 != NULL) //當(dāng)前節(jié)點有一個為空
return false;
else
{
//彈出兩個樹的棧頂元素
p1 = _sta1.top();
p2 = _sta2.top();
_sta1.pop();
_sta2.pop();
}
}
return true;
}
//遞歸判斷兩棵樹是否相似
bool IsSemblable2(BiTree T1,BiTree T2)
{
bool leftS = false,rightS = false; //用來接受子樹返回的信息
if(T1 == NULL && T2 == NULL) //兩個結(jié)點都為空
return true;
else if(T1 == NULL || T2 == NULL) //有一個結(jié)點不為空
return false;
else
{
int leftS = IsSemblable2(T1->lchild,T2->lchild); //遞歸左子樹
int rightS = IsSemblable2(T1->rchild,T2->rchild); //遞歸右子樹
return leftS && rightS ; //返回兩個子樹的信息
}
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見會出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個僅僅是一種編譯期的解決方案,如果程序在運(yùn)行過程中出現(xiàn)了循環(huán)引用,還是會造成內(nèi)存泄漏的2013-09-09
C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表
大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧2022-05-05

