1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| class Helper { public: explicit Helper(TreeNode* head) { init_map(head); set_map(head); }
TreeNode* query(TreeNode* node1, TreeNode* node2) {
// for (const auto& x : mp_) { // for (const auto& y : x.second) { // std::cout << x.first->val << " " << y.first->val << " " << y.second->val << std::endl; // } // }
if (node1 == node2) { return node1; } auto node1_iter = mp_.find(node1); if (node1_iter != mp_.end()) { auto node2_iter = (*node1_iter).second.find(node2); if (node2_iter != (*node1_iter).second.end()) { return (*node2_iter).second; } }
auto iter2 = mp_.find(node2); if (iter2 != mp_.end()) { auto iter1 = (*iter2).second.find(node1); if (iter1 != (*iter2).second.end()) { return (*iter1).second; } } return nullptr; }
private: void init_map(TreeNode* head) { if (head == nullptr) return; mp_[head] = std::unordered_map<TreeNode*, TreeNode*>(); init_map(head->left); init_map(head->right); }
void set_map(TreeNode* head) { if (head == nullptr) return; head_record(head->left, head); head_record(head->right, head); sub_record(head); set_map(head->left); set_map(head->right); }
void head_record(TreeNode* node, TreeNode* head) { if (node == nullptr) return; mp_[node][head] = head; head_record(node->left, head); head_record(node->right, head); }
void sub_record(TreeNode* head) { if (head == nullptr) return; pre_left(head->left, head->right, head); sub_record(head->left); sub_record(head->right); }
void pre_left(TreeNode* left, TreeNode* right, TreeNode* head) { if (left == nullptr) { return; } pre_right(left, right, head); pre_left(left->left, right, head); pre_left(left->right, right, head); }
void pre_right(TreeNode* left, TreeNode* right, TreeNode* head) { if (right == nullptr) return; mp_[left][right] = head; pre_right(left, right->left, head); pre_right(left, right->right, head); }
private: std::unordered_map<TreeNode*, std::unordered_map<TreeNode*, TreeNode*>> mp_; };
class Solution2 { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { Helper helper(root); return helper.query(p, q); } };
|