剑指offer之求二叉树中两个节点的最低共同父节点
生活随笔
收集整理的這篇文章主要介紹了
剑指offer之求二叉树中两个节点的最低共同父节点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 問題
求二叉樹中倆個節點的最低共同父節點,比如二叉樹如下
? ? ? ? ? ? ? ? 42 ? ? ? ? 61 ? ? 3 ? 5 ? ? 7? 比如節點1和3兩個節點的最低共同父節點是2,節點3和5兩個節點的最低共同父節點是4,節點5和6兩個節點的最低共同父節點是6,
? 也有可能其中1個節點或者2個節點不在二叉樹里面,那么他們就沒有最低共同父節點。
?
?
?
?
?
2 分析
? ? ? ? ? ? 42 ? ? ? ? 61 ? ? 3 ? 5 ? ? 7比如我們求節點1和3兩個節點的最低共同父節點,我們保存每個根節點到該節點的最短路徑節點值,比如節點1的路徑就是4->2->1 然后節點3的路徑是4->2->3,然后我們再把這個保存的2個路徑依次從尾巴進行進行比較,然后就能獲取兩個節點的最低共同父節點值。
?
?
?
?
?
3 代碼實現
#include <iostream> #include <vector> #include <stdlib.h>using namespace std;typedef struct Tree {int value;struct Tree* left;struct Tree* right;Tree(int value) : value(value), left(NULL), right(NULL) {} } Tree;class CommonParentNode { public:bool hasPath(Tree* head, Tree* node, std::vector<Tree *>& vector){if (head == NULL)return false;///先把我們的遍歷節點保存到vector里面去vector.push_back(head);if (head == node)return true;//如果這樣寫只能說明子遞歸return值了,但是這個函數沒有返回值。if (head->left != NULL && hasPath(head->left, node, vector))return true;if (head->right != NULL && hasPath(head->right, node, vector))return true;//這里一定要調用pop_back函數,如果這個節點的左右子節點都為空或者左子樹或者右子樹里面不包含這個我們的節點,//這個節點就要彈出來,如果沒有這個函數,那么我們的vector里面保存的先序遍歷到這個節點的所有節點值,//而不是根節點到這個節點的最短距離。vector.pop_back();return false;}Tree* getCommmonParent(Tree* node, Tree* node1, Tree* node2){if (node == NULL || node1 == NULL || node2 == NULL){std::cout << "node == NULL || node1 == NULL || node2 == NULL" << std::endl;return NULL;}vector<Tree *> vector1;vector<Tree *> vector2;bool result1 = hasPath(node, node1, vector1);if (!result1)return NULL;bool result2 = hasPath(node, node2, vector2);if (!result2)return NULL;//我們vector依次保存的是從頭結點到該節點的路徑,我們遍歷的時候應該從vector的尾巴開始遍歷,注釋的遍歷錯了,要注意// for (int i = 0; i < vector1.size(); ++i)// {// for (int j = 0; j < vector2.size(); ++j)// {// //if (vector1[i]->value == vector2[j]->value)// if (vector1[i] == vector2[j])// {// std::cout << "common parent node value is" << vector1[i]->value << std::endl;// return vector1[i];// }// }// } for (int i = vector1.size() - 1; i >= 0; --i){for (int j = vector2.size() - 1; j >= 0; --j){//if (vector1[i]->value == vector2[j]->value)if (vector1[i] == vector2[j]){return vector1[i];}}} return NULL; } };int main() {Tree *node1 , *node2 , *node3, *node4, *node5, *node6, *node7, *node8;node1 = (Tree *)malloc(sizeof(Tree));node2 = (Tree *)malloc(sizeof(Tree));node3 = (Tree *)malloc(sizeof(Tree));node4 = (Tree *)malloc(sizeof(Tree));node5 = (Tree *)malloc(sizeof(Tree));node6 = (Tree *)malloc(sizeof(Tree));node7 = (Tree *)malloc(sizeof(Tree)); node8 = (Tree *)malloc(sizeof(Tree)); node1->value = 4;node2->value = 2;node3->value = 6;node4->value = 1;node5->value = 3;node6->value = 5;node7->value = 7;node8->value = 8;node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node4->left = NULL;node4->right = NULL;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;node7->left = NULL;node7->right = NULL;/*** 42 61 3 5 7 **/CommonParentNode commonParentNode;Tree *commonTreeNode = NULL;commonTreeNode = commonParentNode.getCommmonParent(node1, node5, node7);if (!commonTreeNode){std::cout << "the two node do not find commonTreeNode" << std::endl;return -1;}std::cout << "commonTreeNode parent node value is " << commonTreeNode->value << std::endl;return 0; }?
?
?
?
?
4 運行結果
commonTreeNode parent node value is 4?
?
?
?
5 總結
這個題目的思路是保存根節點到每個節點中途最短路徑父節點值,然后進行比較,同時我們應該可以知道求根節點到該節點最短路徑的每個節點值,就是vector里面保存的每個節點,同時也知道根節點到該節點的高度值,也就是這個vecter里面保存數據的大小,既vector.size()函數的值,代碼和上面部分代碼一樣。
bool hasPath(Tree* head, Tree* node, std::vector<Tree *>& vector){if (head == NULL)return false;///先把我們的遍歷節點保存到vector里面去vector.push_back(head);if (head == node)return true;//如果這樣寫只能說明子遞歸return值了,但是這個函數沒有返回值。if (head->left != NULL && hasPath(head->left, node, vector))return true;if (head->right != NULL && hasPath(head->right, node, vector))return true;//這里一定要調用pop_back函數,如果這個節點的左右子節點都為空或者左子樹或者右子樹里面不包含這個我們的節點,//這個節點就要彈出來,如果沒有這個函數,那么我們的vector里面保存的先序遍歷到這個節點的所有節點值,//而不是根節點到這個節點的最短距離。vector.pop_back();return false;}很經典的代碼。
總結
以上是生活随笔為你收集整理的剑指offer之求二叉树中两个节点的最低共同父节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之二叉树的下一个结点
- 下一篇: 剑指offer之重建二叉树