国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

判斷兩顆二叉樹是否相似的兩種方法

2020-05-23 12:53:35
字體:
供稿:網(wǎng)友

名稱:判斷兩個(gè)二叉樹是否相似

說明:此處的兩個(gè)方法一個(gè)是非遞歸,一個(gè)是遞歸算法。其實(shí)兩個(gè)算法的本質(zhì)思路是一樣的就是,判斷位置相同的兩個(gè)結(jié)點(diǎn)是否同時(shí)為空或同時(shí)不為空。只是具體的實(shí)現(xiàn)不一樣。

對(duì)于層次遍歷法:此處不小心用錯(cuò)了,本應(yīng)該用隊(duì)列來當(dāng)作排列下一層元素的。歪打正著,此處用棧也可以,只是判斷的結(jié)點(diǎn)順序不一樣。隊(duì)列的話,是從每一層的左端到右端。棧的話,是從右端到左端。在此處都沒影響。我去,有發(fā)現(xiàn)一點(diǎn),要從右到左訪問一層的元素的話,應(yīng)該用棧。

對(duì)于遞歸,看起來比非遞歸要簡(jiǎn)單不少。基本的思路很簡(jiǎn)單,要注意的是,在程序需要從子樹接收返回是否相似的信息。這樣的話,有一個(gè)問題,就是必須等樹完全判斷完才可以最終返回。不想上面的,過程中發(fā)現(xiàn)不一樣就可以立即返回了。

//層次遍歷法判斷兩棵樹是否相似bool IsSemblable1(BiTree T1,BiTree T2){  stack<BiTNode* > _sta1,_sta2;  //用來存放下一層元素的容器,此處棧和隊(duì)列都行  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都不為空時(shí)    {      if(p1->lchild != NULL && p2->lchild != NULL)  //如果p1和p2的左子樹都不為空時(shí)      {        _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的右子樹都不為空時(shí)      {        _sta1.push(p1->rchild);        _sta2.push(p2->rchild);      }      else if(p1->rchild != NULL || p2->rchild != NULL)  //如果p1的右子樹為空,但是p2的右子樹不為空,或者相反        return false;      //訪問完兩棵樹的當(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è)樹的棧頂元素      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)    //兩個(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);  //遞歸左子樹    int rightS = IsSemblable2(T1->rchild,T2->rchild);  //遞歸右子樹    return leftS && rightS ;  //返回兩個(gè)子樹的信息  }}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 栾城县| 平定县| 蒲城县| 都昌县| 大英县| 南康市| 天等县| 佛教| 浠水县| 北辰区| 宿迁市| 武胜县| 称多县| 乳源| 新营市| 辛集市| 仙桃市| 沂源县| 鄂托克旗| 会宁县| 怀宁县| 平陆县| 甘泉县| 平遥县| 乌海市| 宁远县| 博客| 临洮县| 梁河县| 文安县| 固镇县| 南昌县| 淮南市| 综艺| 和田县| 闽清县| 荥阳市| 普兰县| 平原县| 怀集县| 车致|