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

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

C++實現尋找最低公共父節點的方法

2020-01-26 15:18:03
字體:
來源:轉載
供稿:網友

本文實例講述了C++實現尋找最低公共父節點的方法,是數據結構中二叉樹的經典算法。分享給大家供大家參考。具體方法如下:

最低公共父節點,意思很好理解。

思路1:最低公共父節點滿足這樣的條件:兩個節點分別位于其左子樹和右子樹,那么定義兩個bool變量,leftFlag和rightFlag,如果在左子樹中,leftFlag為true,如果在右子樹中,rightFlag為true,僅當leftFlag == rightFlag == true時,才能滿足條件。

實現代碼如下:

#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; }}

這類問題在面試的時候常會遇到,對此需要考慮以下情形:

1. node1和node2指向同一節點,這個如何處理
2. node1或node2有不為葉子節點的可能性嗎
3. node1或node2一定在樹中嗎

還要考慮一個效率問題,上述代碼中用了兩個遞歸函數,而且存在不必要的遞歸過程,仔細思考,其實一個遞歸過程足以解決此問題

實現代碼如下:

#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;}

下面再換一種方式的寫法如下:

#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;}

希望本文所述對大家C++程序算法設計的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高唐县| 普兰店市| 贡觉县| 明星| 玉田县| 磴口县| 黎城县| 周至县| 丰顺县| 图片| 清涧县| 交城县| 五莲县| 冕宁县| 嵊泗县| 玉环县| 昌都县| 哈巴河县| 蓬莱市| 广丰县| 诸城市| 清涧县| 法库县| 白玉县| 凤城市| 龙游县| 梅州市| 拉孜县| 博客| 鄂托克前旗| 华池县| 东乡| 东阳市| 扎鲁特旗| 崇文区| 洛南县| 北流市| 清水河县| 通河县| 桂阳县| 错那县|