目录
剑指 Offer 68 - II. 二叉树的最近公共祖先 - 力扣(LeetCode)
剑指offer68-给定二叉树的两个节点node1和node2,找到他们的最低公共祖先节点
例如5和1的最低公共祖先节点为3;4和6的最低公共祖先节点为5
一、方法1
用哈希表记录整棵树的父节点信息,并且用一个set容器将其中一个节点的父节点全放在set中,然后遍历另外一个节点的父节点,查是否在set容器中,如果有就返回此时的父节点
BinaryNode* lowestCommonAncestor(BinaryNode* headnode, BinaryNode* node1, BinaryNode* node2) {
unordered_map<BinaryNode*, BinaryNode*> fatherMap;
fatherMap.insert(make_pair(headnode, headnode));
process(headnode, fatherMap);
set<BinaryNode*> set1;
BinaryNode* cur1 = node1;
while (cur1 != fatherMap[cur1]) {
set1.insert(cur1);
cur1 = fatherMap[cur1];
}
set1.insert(headnode);
BinaryNode* cur2 = node2;
while (!set1.count(cur2)) {
cur2 = fatherMap[cur2];
}
return cur2;
}
void process(BinaryNode* headnode, unordered_map<BinaryNode*, BinaryNode*> fatherMap) {
if (headnode == nullptr) {
return;
}
fatherMap.insert(make_pair(headnode->m_left, headnode));
fatherMap.insert(make_pair(headnode->m_right, headnode));
process(headnode->m_left, fatherMap);
process(headnode->m_right, fatherMap);
}
二、方法2
分析节点可能出现的情况
第一种:node1和node2在同一边,谁在上面谁就是祖父节点
第二种:node1和node2不在同一边
BinaryNode* lowestCommonAncestor(BinaryNode* headnode, BinaryNode* node1, BinaryNode* node2) {
if (headnode == nullptr || headnode == node1 || headnode == node2) {
//相当于找node1,和node2,找不到就返回nullptr
//并且如果node1和node2同时在左边或者同时在右边,谁在上面谁就是祖父节点
return headnode;
}
BinaryNode* left = lowestCommonAncestor(headnode->m_left, node1, node2);
BinaryNode* right = lowestCommonAncestor(headnode->m_right, node1, node2);
//node1和node2不在同一边,所以headnode就是祖父节点
if (left != nullptr && right != nullptr) {
return headnode;
}
//左右两棵树并不都有返回值,那边有返回值就是祖父节点
return left != nullptr ? left : right;
}