最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法

 更新時(shí)間:2014年09月18日 09:53:08   投稿:shichen2014  
這篇文章主要介紹了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的一個(gè)經(jīng)典算法,有一定的借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的經(jīng)典算法。分享給大家供大家參考。具體方法如下:

最低公共父節(jié)點(diǎn),意思很好理解。

思路1:最低公共父節(jié)點(diǎn)滿足這樣的條件:兩個(gè)節(jié)點(diǎn)分別位于其左子樹(shù)和右子樹(shù),那么定義兩個(gè)bool變量,leftFlag和rightFlag,如果在左子樹(shù)中,leftFlag為true,如果在右子樹(shù)中,rightFlag為true,僅當(dāng)leftFlag == rightFlag == true時(shí),才能滿足條件。

實(shí)現(xiàn)代碼如下:

#include <iostream>

using namespace std;

struct Node
{
 Node(int i = 0, Node *pLeft = NULL, Node *pRight = NULL) : data(i), left(pLeft),
 right(pRight) {}
 Node *left;
 Node *right;
 int data;
};

Node *constructNode(Node **pNode1, Node **pNode2)
{
 Node *node12 = new Node(12);
 Node *node11 = new Node(11);
 Node *node10 = new Node(10);
 Node *node9 = new Node(9, NULL, node12);
 Node *node8 = new Node(8, node11, NULL);
 Node *node7 = new Node(7);
 Node *node6 = new Node(6);
 Node *node5 = new Node(5, node8, node9);
 Node *node4 = new Node(4, node10);
 Node *node3 = new Node(3, node6, node7);
 Node *node2 = new Node(2, node4, node5);
 Node *node1 = new Node(1, node2, node3);

 *pNode1 = node6;
 *pNode2 = node12;

 return node1;
}

bool isNodeIn(Node *root, Node *node1, Node *node2)
{
 if (node1 == NULL || node2 == NULL)
 {
 throw("invalid node1 and node2");
 return false;
 }
 if (root == NULL)
 return false;

 if (root == node1 || root == node2)
 {
 return true;
 }
 else
 {
 return isNodeIn(root->left, node1, node2) || isNodeIn(root->right, node1, node2);
 }
}

Node *lowestFarther(Node *root, Node *node1, Node *node2)
{
 if (root == NULL || node1 == NULL || node2 == NULL || node1 == node2)
 {
 return NULL;
 }
 
 bool leftFlag = false;
 bool rightFlag = false;
 leftFlag = isNodeIn(root->left, node1, node2);
 rightFlag = isNodeIn(root->right, node1, node2);

 if (leftFlag == true && rightFlag == true)
 {
 return root;
 }
 else if (leftFlag == true)
 {
 return lowestFarther(root->left, node1, node2);
 }
 else
 {
 return lowestFarther(root->right, node1, node2);
 }
}

void main()
{
 Node *node1 = NULL;
 Node *node2 = NULL;
 Node *root = constructNode(&node1, &node2);

 cout << "node1: " << node1->data << endl;
 cout << "node2: " << node2->data << endl;
 cout << "root: " << root->data << endl;

 Node *father = lowestFarther(root, node1, node2);

 if (father == NULL)
 {
 cout << "no common father" << endl;
 }
 else
 {
 cout << "father: " << father->data << endl;
 }
}

這類問(wèn)題在面試的時(shí)候常會(huì)遇到,對(duì)此需要考慮以下情形:

1. node1和node2指向同一節(jié)點(diǎn),這個(gè)如何處理
2. node1或node2有不為葉子節(jié)點(diǎn)的可能性嗎
3. node1或node2一定在樹(shù)中嗎

還要考慮一個(gè)效率問(wèn)題,上述代碼中用了兩個(gè)遞歸函數(shù),而且存在不必要的遞歸過(guò)程,仔細(xì)思考,其實(shí)一個(gè)遞歸過(guò)程足以解決此問(wèn)題

實(shí)現(xiàn)代碼如下:

#include <iostream>

using namespace std;

struct Node
{
 Node(int i = 0, Node *pLeft = NULL, Node *pRight = NULL) : data(i),
 left(pLeft), right(pRight) {}
 int data;
 Node *left;
 Node *right;
};

Node *constructNode(Node **pNode1, Node **pNode2) 
{ 
 Node *node12 = new Node(12); 
 Node *node11 = new Node(11); 
 Node *node10 = new Node(10); 
 Node *node9 = new Node(9, NULL, node12); 
 Node *node8 = new Node(8, node11, NULL); 
 Node *node7 = new Node(7); 
 Node *node6 = new Node(6); 
 Node *node5 = new Node(5, node8, node9); 
 Node *node4 = new Node(4, node10); 
 Node *node3 = new Node(3, node6, node7); 
 Node *node2 = new Node(2, node4, node5); 
 Node *node1 = new Node(1, node2, node3); 

 *pNode1 = node6; 
 *pNode2 = node5; 

 return node1; 
}

bool lowestFather(Node *root, Node *node1, Node *node2, Node *&dest)
{
 if (root == NULL || node1 == NULL || node2 == NULL || node1 == node2)
 return false;
 if (root == node1 || root == node2)
 return true;

 bool leftFlag = lowestFather(root->left, node1, node2, dest);
 bool rightFlag = lowestFather(root->right, node1, node2, dest);
 
 if (leftFlag == true && rightFlag == true)
 {
 dest = root;
 }
 if (leftFlag == true || rightFlag == true)
 return true;
}

int main()
{
 Node *node1 = NULL;
 Node *node2 = NULL;
 Node *root = constructNode(&node1, &node2);

 bool flag1 = false;
 bool flag2 = false;
 Node *dest = NULL;
 bool flag = lowestFather(root, node1, node2, dest);

 if (dest != NULL)
 {
 cout << "lowest common father: " << dest->data << endl;
 }
 else
 {
 cout << "no common father!" << endl;
 }

 return 0;
}

下面再換一種方式的寫(xiě)法如下:

#include <iostream>

using namespace std;

struct Node
{
 Node(int i = 0, Node *pLeft = NULL, Node *pRight = NULL) : data(i),
 left(pLeft), right(pRight) {}
 int data;
 Node *left;
 Node *right;
};

Node *constructNode(Node **pNode1, Node **pNode2) 
{ 
 Node *node12 = new Node(12); 
 Node *node11 = new Node(11); 
 Node *node10 = new Node(10); 
 Node *node9 = new Node(9, NULL, node12); 
 Node *node8 = new Node(8, node11, NULL); 
 Node *node7 = new Node(7); 
 Node *node6 = new Node(6); 
 Node *node5 = new Node(5, node8, node9); 
 Node *node4 = new Node(4, node10); 
 Node *node3 = new Node(3, node6, node7); 
 Node *node2 = new Node(2, node4, node5); 
 Node *node1 = new Node(1, node2, node3); 

 *pNode1 = node11; 
 *pNode2 = node12; 

 return node1; 
}

Node* lowestFather(Node *root, Node *node1, Node *node2)
{
 if (root == NULL || node1 == NULL || node2 == NULL || node1 == node2)
 return NULL;
 if (root == node1 || root == node2)
 return root;

 Node* leftFlag = lowestFather(root->left, node1, node2);
 Node* rightFlag = lowestFather(root->right, node1, node2);

 if (leftFlag == NULL)
 return rightFlag;
 else if (rightFlag == NULL)
 return leftFlag;
 else
 return root;
}

int main()
{
 Node *node1 = NULL;
 Node *node2 = NULL;
 Node *root = constructNode(&node1, &node2);

 bool flag1 = false;
 bool flag2 = false;
 Node *dest = NULL;
 Node* flag = lowestFather(root, node1, node2);

 if (flag != NULL)
 {
 cout << "lowest common father: " << flag->data << endl;
 }
 else
 {
 cout << "no common father!" << endl;
 }

 return 0;
}

希望本文所述對(duì)大家C++程序算法設(shè)計(jì)的學(xué)習(xí)有所幫助。

相關(guān)文章

  • C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    常見(jiàn)的瓦片地圖有矩形、菱形、正六邊形幾種。此文章主要討論菱形瓦片,也就是大家常說(shuō)的2.5D,斜45度瓦片地圖。比如《紅警2》、《帝國(guó)時(shí)代2》都是采用這種技術(shù)
    2022-09-09
  • C++中const用于函數(shù)重載的示例代碼

    C++中const用于函數(shù)重載的示例代碼

    這篇文章主要介紹了C++中const用于函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • C++讀寫(xiě).mat文件的方法

    C++讀寫(xiě).mat文件的方法

    本文介紹了“C++讀寫(xiě).mat文件的方法”,需要的朋友可以參考一下
    2013-03-03
  • C++?Boost?StringAlgorithms超詳細(xì)講解

    C++?Boost?StringAlgorithms超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • Qt自定義控件實(shí)現(xiàn)多彩色儀表盤

    Qt自定義控件實(shí)現(xiàn)多彩色儀表盤

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)多彩色儀表盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中std::thread{}和std::thread()用法

    C++中std::thread{}和std::thread()用法

    std::thread{}和std::thread()在C++中都可以用于創(chuàng)建線程對(duì)象,但std::thread{}作為C++11引入的統(tǒng)一初始化,更推薦使用,因?yàn)樗踩?、更易讀,且避免了隱式類型轉(zhuǎn)換
    2024-11-11
  • cmake添加一個(gè)庫(kù)的實(shí)現(xiàn)步驟

    cmake添加一個(gè)庫(kù)的實(shí)現(xiàn)步驟

    本文主要介紹了cmake添加一個(gè)庫(kù)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Windows下Qt打包自動(dòng)尋找依賴的DLL

    Windows下Qt打包自動(dòng)尋找依賴的DLL

    本文介紹了兩種在Windows下使用Qt打包應(yīng)用程序并自動(dòng)尋找依賴DLL的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • C++的繼承法則詳解

    C++的繼承法則詳解

    本文詳細(xì)介紹了C++中的繼承機(jī)制,包括繼承的概念、定義、使用方法、訪問(wèn)限定符、賦值兼容轉(zhuǎn)換、作用域、默認(rèn)成員函數(shù)、友元關(guān)系、靜態(tài)成員以及單繼承、多繼承和菱形繼承,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 淺析C++的特殊工具與技術(shù)

    淺析C++的特殊工具與技術(shù)

    以下是對(duì)C++中的特殊工具與技術(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08

最新評(píng)論

鄯善县| 静宁县| 石阡县| 和顺县| 玉山县| 彭泽县| 华池县| 四子王旗| 嵊州市| 龙口市| 临海市| 辽阳县| 长葛市| 枝江市| 岗巴县| 周至县| 汉川市| 台江县| 大理市| 九龙城区| 福鼎市| 五莲县| 寻乌县| 行唐县| 会宁县| 喀喇| 二手房| 芦山县| 湘潭市| 樟树市| 咸阳市| 讷河市| 惠东县| 微博| 星子县| 珲春市| 张家界市| 南川市| 天水市| 乌拉特中旗| 红安县|