亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

深入二叉樹兩個結點的最低共同父結點的詳解

2020-01-26 16:10:12
字體:
來源:轉載
供稿:網友
題目:二叉樹的結點定義如下:
復制代碼 代碼如下:

struct TreeNode
   {
              int m_nvalue;
             TreeNode* m_pLeft;
             TreeNode* m_pRight;
};

輸入二叉樹中的兩個結點,輸出這兩個結點在數中最低的共同父結點。
分析:求數中兩個結點的最低共同結點是面試中經常出現的一個問題。這個問題至少有兩個變種。
第一變種是二叉樹是一種特殊的二叉樹:查找二叉樹。也就是樹是排序過的,位于左子樹上的結點都比父結點小,而位于右子樹的結點都比父結點大。我們只需要從根結點開始和兩個結點進行比較。如果當前結點的值比兩個結點都大,則最低的共同父結點一定在當前結點的左子樹中。如果當前結點的值比兩個結點都小,則最低的共同父結點一定在當前結點的右子樹中。
第二個變種是樹不一定是二叉樹,每個結點都有一個指針指向它的父結點。于是我們可以從任何一個結點出發(fā),得到一個到達樹根結點的單向鏈表。因此這個問題轉換為求兩個單向鏈表的第一個公共結點。
現在我們回到這個問題本身。所謂共同的父結點,就是兩個結點都出現在這個結點的子樹中。因此我們可以定義一函數,來判斷一個結點的子樹中是不是包含了另外一個結點。這不是件很難的事,我們可以用遞歸的方法來實現:
復制代碼 代碼如下:

/*
// If the tree with head pHead has a node pNode, return true.
// Otherwise return false.
*/
bool HasNode(TreeNode* pHead, TreeNode* pNode)
{
 if(pHead == pNode)
  return true;
 bool has = false;
 if(pHead->m_pLeft != NULL)
  has = HasNode(pHead->m_pLeft, pNode);
 if(!has && pHead->m_pRight != NULL)
  has = HasNode(pHead->m_pRight, pNode);
 return has;
}

我們可以從根結點開始,判斷以當前結點為根的樹中左右子樹是不是包含我們要找的兩個結點。如果兩個結點都出現在它的左子樹中,那最低的共同父結點也出現在它的左子樹中。如果兩個結點都出現在它的右子樹中,那最低的共同父結點也出現在它的右子樹中。如果兩個結點一個出現在左子樹中,一個出現在右子樹中,那當前的結點就是最低的共同父結點。基于這個思路,我們可以寫出如下代碼:
復制代碼 代碼如下:

/*
// Find the last parent of pNode1 and pNode2 in a tree with head pHead
*/
TreeNode* LastCommonParent_1(TreeNode* pHead, TreeNode* pNode1, TreeNode* pNode2)
{
 if(pHead == NULL || pNode1 == NULL || pNode2 == NULL)
  return NULL;
 // check whether left child has pNode1 and pNode2
 bool leftHasNode1 = false;
 bool leftHasNode2 = false;
 if(pHead->m_pLeft != NULL)
 {
  leftHasNode1 = HasNode(pHead->m_pLeft, pNode1);
  leftHasNode2 = HasNode(pHead->m_pLeft, pNode2);
 }
 if(leftHasNode1 && leftHasNode2)
 {
  if(pHead->m_pLeft == pNode1 || pHead->m_pLeft == pNode2)
   return pHead;
  return LastCommonParent_1(pHead->m_pLeft, pNode1, pNode2);
 }
 // check whether right child has pNode1 and pNode2
 bool rightHasNode1 = false;
 bool rightHasNode2 = false;
 if(pHead->m_pRight != NULL)
 {
  if(!leftHasNode1)
   rightHasNode1 = HasNode(pHead->m_pRight, pNode1);
  if(!leftHasNode2)
   rightHasNode2 = HasNode(pHead->m_pRight, pNode2);
 }
 if(rightHasNode1 && rightHasNode2)
 {
  if(pHead->m_pRight == pNode1 || pHead->m_pRight == pNode2)
   return pHead;
  return LastCommonParent_1(pHead->m_pRight, pNode1, pNode2);
 }
 if((leftHasNode1 && rightHasNode2) || (leftHasNode2 && rightHasNode1))
  return pHead;
 return NULL;
}

接著我們來分析一下這個方法的效率。函數HasNode的本質就是遍歷一棵樹,其時間復雜度是O(n)(n是樹中結點的數目)。由于我們根結點開始,要對每個結點調用函數HasNode。因此總的時間復雜度是O(n^2)。
我們仔細分析上述代碼,不難發(fā)現我們判斷以一個結點為根的樹是否含有某個結點時,需要遍歷樹的每個結點。接下來我們判斷左子結點或者右結點為根的樹中是否含有要找結點,仍然需要遍歷。第二次遍歷的操作其實在前面的第一次遍歷都做過了。由于存在重復的遍歷,本方法在時間效率上肯定不是最好的。
前面我們提過如果結點中有一個指向父結點的指針,我們可以把問題轉化為求兩個鏈表的共同結點?,F在我們可以想辦法得到這個鏈表。我們在這里稍作變化即可:
復制代碼 代碼如下:

/*
// Get the path form pHead and pNode in a tree with head pHead
*/
bool GetNodePath(TreeNode* pHead, TreeNode* pNode, std::list<TreeNode*>& path)
{
 if(pHead == pNode)
  return true;
 path.push_back(pHead);
 bool found = false;
 if(pHead->m_pLeft != NULL)
  found = GetNodePath(pHead->m_pLeft, pNode, path);
 if(!found && pHead->m_pRight)
  found = GetNodePath(pHead->m_pRight, pNode, path);
 if(!found)
  path.pop_back();
 return found;
}

 由于這個路徑是從跟結點開始的。最低的共同父結點就是路徑中的最后一個共同結點:
復制代碼 代碼如下:

/*
// Get the last common Node in two lists: path1 and path2
*/
TreeNode* LastCommonNode
(
 const std::list<TreeNode*>& path1,
 const std::list<TreeNode*>& path2
 )
{
 std::list<TreeNode*>::const_iterator iterator1 = path1.begin();
 std::list<TreeNode*>::const_iterator iterator2 = path2.begin();  
 TreeNode* pLast = NULL;
 while(iterator1 != path1.end() && iterator2 != path2.end())
 {
  if(*iterator1 == *iterator2)
   pLast = *iterator1;
  iterator1++;
  iterator2++;
 }
 return pLast;
}

有了前面兩個子函數之后,求兩個結點的最低共同父結點就很容易了。我們先求出從根結點出發(fā)到兩個結點的兩條路徑,再求出兩條路徑的最后一個共同結點。代碼如下:
復制代碼 代碼如下:

/*
// Find the last parent of pNode1 and pNode2 in a tree with head pHead
*/
TreeNode* LastCommonParent_2(TreeNode* pHead, TreeNode* pNode1, TreeNode* pNode2)
{
 if(pHead == NULL || pNode1 == NULL || pNode2 == NULL)
  return NULL;
 std::list<TreeNode*> path1;
 GetNodePath(pHead, pNode1, path1);
 std::list<TreeNode*> path2;
 GetNodePath(pHead, pNode2, path2);
 return LastCommonNode(path1, path2);
}

這種思路的時間復雜度是O(n),時間效率要比第一種方法好很多。但同時我們也要注意到,這種思路需要兩個鏈表來保存路徑,空間效率比不上第一個方法。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

性久久久久久久久久久久久久| 高清shemale亚洲人妖| 国产系列电影在线播放网址| 日本wwww视频| av无码av天天av天天爽| 蜜桃传媒一区二区亚洲av| 亚洲一区二区视频在线观看| 操操操干干干| 成人黄色小视频在线观看| 国产精品一在线观看| av观看成片免费网站| 黄色小视频在线播放| 神马日本精品| 激情图区综合网| 亚洲精品国产精品国自产观看浪潮| 国产一级一片免费播放| 红桃视频 国产| 欧美色图综合网| 黑人巨大精品一区二区在线| 国内在线免费高清视频| 91丝袜一区二区三区| 国产日韩欧美综合一区| 久久久99久久精品女同性| 翔田千里在线视频| 人妻与黑人一区二区三区| 国产精品十八以下禁看| 精品人妻一区二区三区视频| av免费在线视| 2019年中文字幕| 夜夜嗨aⅴ免费视频| 97人妻一区二区精品视频| 成人看片在线| 日本美女视频一区| 欧美影院在线| 国产精品视频久久久| 久久99久久久久| 久草视频免费播放| 欧美不卡在线视频| 免费av一区二区| 亚洲人成电影在线播放| 国产精品影片在线观看| 成人在线免费观看视频网站| 国产第一页在线观看| 美女视频黄a视频全免费观看| 韩日视频在线| 久久爱.com| 国产精品久久久久四虎| 色老板在线视频一区二区| av手机在线看| 一本久道在线| 亚洲最大天堂网| 青春娱乐分类视频精品2动漫| 777奇米888色狠狠俺也去| 少妇特黄a一区二区三区| 精品无码一区二区三区在线| 狠狠v欧美ⅴ日韩v亚洲v大胸| 成人免费一区二区三区视频网站| 国产精品久久久久久妇女6080| av电影资源| 鲁鲁狠狠狠7777一区二区| 国产一区二区在线网站| www.激情小说.com| 亚州精品国产精品乱码不99按摩| 992tv在线影院| 欧美激情国产高清| 庆余年2免费日韩剧观看大牛| 国内外成人免费激情在线视频网站| 亚洲欧美国产精品va在线观看| 澳门永久av免费网站| 黑人操亚洲女人| 国产羞羞视频在线观看| 宅男噜噜噜66一区二区66| 国产高清一区日本| 精品无人区乱码1区2区3区免费| 先锋影音一区二区三区| 国产精品亚洲欧美一级在线| 欧美一区二区三区四区在线观看地址| 性欧美大战久久久久久久免费观看| 日日摸日日碰夜夜爽av| 免费毛片一区二区三区久久久| 欧美日韩另类综合| 精品伦理一区二区三区| 涩涩屋成人免费视频软件| 亚洲一区二区三区四区五区黄| 一区在线不卡| 亚洲国产精品久久久久婷婷老年| 最新天堂网www| 奇米在线7777在线精品| 亚洲成人av电影在线| av午夜一区麻豆| 高清国语自产拍免费一区二区三区| 国产精品福利一区二区| 欧美日韩国产999| 欧美激情在线看| 99视频在线观看一区三区| 图片专区亚洲欧美另类| 男女男精品视频网站| 亚洲午夜无码av毛片久久| 日本精品福利视频| 猫咪成人在线观看| 国产成人无码专区| 国产成人无码一区二区在线观看| 国产精品一级黄| 成人国产精品一区二区网站| 精品国产乱码91久久久久久网站| 国产日韩欧美电影在线观看| 99国产精品视频免费观看一公开| 欧美激情亚洲综合一区| 精品乱子伦一区二区三区| 实拍女处破www免费看| 亚洲一区网站| 666欧美在线视频| 欧美另类第一页| 国产在线拍揄自揄拍无码视频| 一区二区三区我不卡| 色噜噜成人av在线| 日本一区二区成人在线| 超碰97久久国产精品牛牛| 黄色av电影在线观看| 国产精品第一页第二页第三页| 永久久久免费浮力影院| 亚洲欧美成人精品| 亚欧美一区二区三区| 国产a视频精品免费观看| 国产精品一区二区三区免费视频| 一区二区三区在线视频观看| 午夜福利一区二区三区| 亚洲xxxx2d动漫1| 性感女国产在线| 日韩在线观看视频一区| 福利视频导航一区| 999亚洲国产精| 成人高清av| 91porn在线观看| 欧美成人小视频| 一级久久久久久久| 日本xxxx裸体xxxx| 久久一留热品黄| 亚洲成va人在线观看| 欧美美女操人视频| 国产日韩欧美电影在线观看| 久久激情视频免费观看| 色播久久人人爽人人爽人人片视av| 国产一精品一aⅴ一免费| 99视频在线观看一区三区| 福利片一区二区三区| 天天操夜夜做| 国产青草视频在线观看视频| 精品毛片三在线观看| 久久精品国产一区二区三区不卡| 欧美一卡2卡3卡4卡无卡免费观看水多多| 国产主播福利| 日韩和的一区二区| 奇米精品一区二区三区在线观看一| 日本午夜精品理论片a级app发布| 亚洲成人激情在线观看| 国产成人免费网站| 国产高清www| 久本草在线中文字幕亚洲欧美| 91视频在线看| 午夜精品久久久久久久99老熟妇| 日本高清www| 中文字幕一区二区三区乱码不卡| 国产黄色片免费看| 韩国一区二区三区视频| 波多野结衣视频在线播放| 亚洲蜜桃视频| 亚洲制服在线观看| 九七影院理论片| 欧美三级在线看| 国产中文一区二区三区| 日韩欧美在线网站| 欧美韩日一区二区| 日韩毛片免费观看| 国产福利在线导航| 日本在线一二三区| 欧美精品久久久久久久免费| 精品国产国产综合精品| 亚洲午夜精品一区 二区 三区| www.亚洲免费| 亚洲精品美女在线| 美女无遮挡网站| 成人羞羞视频免费| 精品一区二区三区免费毛片| 欧美国产日韩xxxxx| 97一区二区国产好的精华液| 色狠狠色噜噜噜综合网| 国产91精品在线播放| 精品国产免费一区二区三区四区| 精品无人区一区二区三区| 免费观看黄色一级视频| 精品亚洲aⅴ乱码一区二区三区| av激情网站| 国产精品一二三区在线观看| 亚洲国产精品成人综合久久久| 在线免费看av网站| 一级黄色录像在线观看| 精品久久久久久久久久ntr影视| 午夜亚洲国产au精品一区二区| 激情综合一区二区三区| 欧美69xxx| 91麻豆精品国产无毒不卡在线观看| 黄视频在线观看网站| 少妇一级淫片免费看| 久久国产精品免费精品3p| 欧美精品国产白浆久久久久| 国产69精品久久久| 综合激情丁香| 精品剧情在线观看| 午夜精品久久17c| 亚洲成人黄色影院| 国产精品66| 手机在线观看av网站| 一区二区三区免费观看| 亚洲成人激情小说| 亚洲福利国产| 日韩欧美视频免费观看| 午夜欧美精品久久久久久久| 欧美视频一区| 91九色老女人| 日韩一区二区不卡| 影音先锋男人资源站| 久久久久久久久一区二区| 青青草手机视频在线观看| 欧美一卡2卡3卡4卡无卡免费观看水多多| 熟女人妻在线视频| 欧美tk丨vk视频| 国产成人精品在线观看| a国产在线视频| 婷婷亚洲五月色综合| 日韩欧美亚洲国产| 亚洲欧美一区二区三区在线观看| 欧美激情在线观看| 91国产一区| 一区二区xxx| 久久综合给合久久狠狠色| 理论片大全免费理伦片| 日韩精品一区二区三区色欲av| 亚洲黄页视频免费观看| 日韩免费一二三区| 精品久久久久久久久久| 99re视频精品| 亚洲人视频在线观看| 成人av.网址在线网站| 怡红院视频网站| 欧美色图一区二区三区| 久久精品成人一区二区三区蜜臀| 一本色道久久综合亚洲精品高清| 欧美一级淫片免费视频魅影视频| 国产成人精品免费在线| 亚洲精选视频在线| 亚洲天堂手机| 伊人中文字幕在线观看| 精品露脸国产偷人在视频| 风间由美一区二区av101| 亚洲综合伊人久久大杳蕉| 国产bdsm视频| 日韩一区亚洲二区| 一区二区三区电影网| 国产精品一区视频| 日本三级网站在线观看| 日本道免费精品一区二区三区| 日韩精品――色哟哟| 黄色精品在线观看| 性爱视频在线播放| h网站视频在线观看| 国产一区二区三区精品久久久| 久久精品理论片| 久久综合色占| 国产欧美日韩伦理| 免费视频二区| 正在播放亚洲一区| 中文字幕三级电影| 宅男噜噜噜66国产日韩在线观看| 91视频一区二区三区| 亚洲日产av中文字幕| 日本不卡一区在线| 超碰aⅴ人人做人人爽欧美| 国产污在线观看| 欧美激情网址| 香蕉成人影院| 全亚洲最色的网站在线观看| 亚洲欧美日韩另类精品一区二区三区| 亚洲成av人影院| www.久久com| 91福利国产成人精品照片| eeuss一区| 天天操夜夜操夜夜操| 日韩一级在线观看| 蜜桃精品视频在线| 国产精品69久久| 91精品人妻一区二区| 久热在线视频精品网站| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲欧美日韩国产综合精品二区| 5月丁香婷婷综合| 天天操天天射天天舔| 热久久这里只有精品| 久久小说免费下载| 99久久人爽人人添人人澡| 久久久电影一区二区三区| 国产黄片一区二区三区| 天天做天天摸天天爽国产一区| 一区二区三区国产精品| 精品网站999www| 男女私大尺度视频| 久草视频手机在线观看| 九九九热999| 亚洲男帅同性gay1069| 男女性激情视频在线观看| 亚洲精品成人网| 在线高清av| 欧美三级午夜理伦| 高潮毛片在线观看| 国产精品va在线观看无码| 国产精品国产精品88| 亚洲国产老妈| 国产男女在线观看| 欧美视频在线观看免费| 中文字幕一区二区精品| 天堂99x99es久久精品免费| 国产精品欧美一区喷水| 99re6在线精品视频免费播放| 欧美一级片在线免费观看| 欧美成年人视频在线观看| 5566中文字幕| 免费日本视频一区| 一区二区三区四区日韩|