<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)236:二叉樹的最近公共祖先

          共 5356字,需瀏覽 11分鐘

           ·

          2021-04-14 14:03

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做 二叉樹的最近公共祖先,我們先來看題面:
          https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

          Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

          給定一個二叉樹, 找到該樹中兩個指定節(jié)點(diǎn)的最近公共祖先。

          示例


          解題


          非遞歸算法

          class Solution {
          public:
              TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
                  stack<TreeNode *> stack;
                  stack.push(root);
                  map<TreeNode *, TreeNode *> parent_map;
                  parent_map[root] = NULL;
                  while(parent_map.find(p) == parent_map.end() || parent_map.find(q) == parent_map.end()){
                      TreeNode *node = stack.top();
                      stack.pop();
                      if(node -> left != NULL){
                          parent_map[node -> left] = node;
                          stack.push(node -> left);
                      }
                      if(node -> right != NULL){
                          parent_map[node -> right] = node;
                          stack.push(node -> right);
                      }
                  }
                  set<TreeNode *> p_parent;
                  p_parent.insert(p);
          // 迭代父節(jié)點(diǎn)map,這里的循環(huán)邏輯為,父節(jié)點(diǎn)字典中如果一直能夠找到p節(jié)點(diǎn)的父節(jié)點(diǎn),就進(jìn)入循環(huán)
          // 這樣可以一直得到p節(jié)點(diǎn)的父節(jié)點(diǎn)列表。
                  while(parent_map.find(p) != parent_map.end()){
                      p_parent.insert(parent_map[p]);
                      p = parent_map[p];
                  }
          // 同理遍歷q節(jié)點(diǎn)的父節(jié)點(diǎn)列表,因?yàn)槭悄嫘虮闅v,所以當(dāng)它存在于p節(jié)點(diǎn)的列表時,找到的就是p和q的最近公共祖先
                  while(parent_map.find(q) != parent_map.end()){
                      if(p_parent.find(q) != p_parent.end()){
                          return q;
                      }
                      q = parent_map[q];
                  }
                  return root;
              }
          };

          遞歸算法

          class Solution {
          public:
              TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
                  int num = contain_node(root, p, q);
                  return ans;
              }
              int contain_node(TreeNode* root, TreeNode* p, TreeNode* q){
                  if(!root) return 0;
                  int mid = 0;
                  if(root == p || root == q) mid = 1;
                  int left = contain_node(root -> left, p, q);
                  if(mid + left == 2){
                      if(!ans) ans = root;
                      return 2;
                  }
                  int right = contain_node(root -> right, p, q);
                  if(left + right + mid >= 2){
                      if(!ans) ans = root;
                      return 2;
                  }
                  return left + mid + right;
              }
          private:
              TreeNode* ans = NULL;
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點(diǎn)個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力 。

          上期推文:

          LeetCode1-220題匯總,希望對你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)221:最大正方形

          LeetCode刷題實(shí)戰(zhàn)222:完全二叉樹的節(jié)點(diǎn)個數(shù)

          LeetCode刷題實(shí)戰(zhàn)223:矩形面積

          LeetCode刷題實(shí)戰(zhàn)224:基本計算器

          LeetCode刷題實(shí)戰(zhàn)225:用隊(duì)列實(shí)現(xiàn)棧

          LeetCode刷題實(shí)戰(zhàn)226:翻轉(zhuǎn)二叉樹

          LeetCode刷題實(shí)戰(zhàn)227:基本計算器 II

          LeetCode刷題實(shí)戰(zhàn)228:匯總區(qū)間

          LeetCode刷題實(shí)戰(zhàn)229:求眾數(shù) II

          LeetCode刷題實(shí)戰(zhàn)230:二叉搜索樹中第K小的元素

          LeetCode刷題實(shí)戰(zhàn)231:2的冪

          LeetCode刷題實(shí)戰(zhàn)232:用棧實(shí)現(xiàn)隊(duì)列

          LeetCode刷題實(shí)戰(zhàn)233:數(shù)字 1 的個數(shù)

          LeetCode刷題實(shí)戰(zhàn)234:回文鏈表

          LeetCode刷題實(shí)戰(zhàn)235:二叉搜索樹的最近公共祖先


          瀏覽 63
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日操夜爽 | 男女靠逼网站 | 五月丁香网操 | 手机av网站大全 手机在线性爱视频 | 日本无码 视频在线观看 |