<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      最近公共祖先 LCA 遞歸非遞歸

      給定一棵二叉樹,找到兩個(gè)節(jié)點(diǎn)的最近公共父節(jié)點(diǎn)(LCA)。
      最近公共祖先是兩個(gè)節(jié)點(diǎn)的公共的祖先節(jié)點(diǎn)且具有最大深度。
      假設(shè)給出的兩個(gè)節(jié)點(diǎn)都在樹中存在。

      dfs遞歸寫法

      查找兩個(gè)node的最近公共祖先,分三種情況:

      1. 如果兩個(gè)node在root的兩邊,那么最近公共祖先就是root。
      2. 如果兩個(gè)node在root的左邊,那么把root的左子樹作為root,再遞歸。
      3. 如果兩個(gè)node在root的右邊,那么把root的右子樹作為root,再遞歸。

      深度優(yōu)先遍歷二叉樹,一旦找到了兩個(gè)節(jié)點(diǎn)其中的一個(gè),就將這個(gè)幾點(diǎn)返回給上一層,上一層節(jié)點(diǎn)通過判斷其左右子樹中是否恰好包含n1和n2兩個(gè)節(jié)點(diǎn),如果找到,對應(yīng)的上一層節(jié)點(diǎn)肯定是所求的LCA;若果不是,將包括兩個(gè)節(jié)點(diǎn)中任意一個(gè)的較低的節(jié)點(diǎn)返回給上一層,否則返回NULL。

       1 /**
       2  * Definition of TreeNode:
       3  * class TreeNode {
       4  * public:
       5  *     int val;
       6  *     TreeNode *left, *right;
       7  *     TreeNode(int val) {
       8  *         this->val = val;
       9  *         this->left = this->right = NULL;
      10  *     }
      11  * }
      12  */
      13 
      14 
      15 class Solution {
      16 public:
      17     /*
      18      * @param root: The root of the binary search tree.
      19      * @param A: A TreeNode in a Binary.
      20      * @param B: A TreeNode in a Binary.
      21      * @return: Return the least common ancestor(LCA) of the two nodes.
      22      */
      23     TreeNode * lowestCommonAncestor(TreeNode * root, TreeNode * A, TreeNode * B) {
      24         // write your code here
      25         //如果當(dāng)前節(jié)點(diǎn)為空,或者與目標(biāo)節(jié)點(diǎn)中的一個(gè)相同,則返回該節(jié)點(diǎn)
      26         if(root == NULL)    return NULL;
      27         if(root==A || root==B)  return root;
      28         
      29         //遞歸尋找A B在左右子樹的位置
      30         TreeNode* left = lowestCommonAncestor(root->left,A,B);
      31         TreeNode* right = lowestCommonAncestor(root->right,A,B);
      32         
      33         //如果A B分別位于root的兩側(cè),則root是他們的LCA,否則是左子樹或者右子樹
      34         if(left&&right) return root;
      35         
      36         return left?left:right;
      37         
      38         
      39     }
      40 };

      非遞歸:

      后序遍歷非遞歸

       1 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
       2     if (root == nullptr)
       3         return root;
       4     stack<TreeNode*> s;
       5     vector<TreeNode*> vec; // p和q的公共祖先
       6     bool tag1 = false; // true:找到p
       7     bool tag2 = false; // true:找到q
       8     s.push(root);
       9     TreeNode* lastRoot = root;
      10     while (!s.empty()) // lastRoot(區(qū)分從左/右孩子返回)
      11     {
      12         root = s.top();
      13         if (root == p) {
      14             if(tag1 == false && tag2 == false)
      15                 vec.push_back(root);
      16             tag1 = true;
      17         }
      18         else if (root == q) {
      19             if (tag2 == false && tag1 == false)
      20                 vec.push_back(root);
      21             tag2 = true;
      22         }
      23         if (!tag1 && !tag2)
      24             vec.push_back(root); // 公共祖先入vector
      25         // 找到p,q并且root在公共祖先數(shù)組中
      26         if (tag1 && tag2 && find(vec.begin(), vec.end(), root) != vec.end())
      27             return root;
      28         // root的孩子節(jié)點(diǎn)還沒訪問
      29         if (lastRoot != root->right)
      30         {
      31             if (lastRoot != root->left) {
      32                 if (root->left != nullptr) {
      33                     s.push(root->left);
      34                     continue;
      35                 }
      36             }
      37             if (root->right != nullptr) {
      38                 s.push(root->right);
      39                 continue;
      40             }
      41         }
      42         // 孩子節(jié)點(diǎn)訪問完,彈棧向上回溯
      43         lastRoot = root;
      44         s.pop();
      45     }
      46     return nullptr;
      47 }

       

      posted @ 2019-06-16 12:08  demianzhang  閱讀(1968)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 在线免费播放av观看| 色综合久久网| 中国猛少妇色xxxxx| 久久亚洲精品中文字幕| 亚洲精品香蕉一区二区| 日韩在线不卡免费视频一区| 国产在线午夜不卡精品影院| 娱乐| 亚洲欧洲无码av电影在线观看| 亚洲综合久久一区二区三区| 伦伦影院精品一区| 99riav精品免费视频观看| 亚洲成人动漫在线| 日本黄页网站免费观看| 成人精品一区二区三区四| 亚洲综合伊人久久大杳蕉| 伊人久久久av老熟妇色| 99精品热在线在线观看视| 亚洲国产精品久久久久秋霞影院| 久99久热这里只有精品| 最近中文字幕国产精品| 台中县| 麻豆天美国产一区在线播放| 精品国产福利一区二区在线| 免费视频爱爱太爽了| 在线国产毛片| 国产精品一二三中文字幕| 最近免费中文字幕大全免费版视频| 九九热在线精品免费视频| 亚洲国产日韩一区三区| 成人午夜看黄在线尤物成人| 久久视频这里只精品| 奇米网777狠狠狠俺| 成全高清在线播放电视剧| 国精品无码一区二区三区左线| 欧美一区二区三区欧美日韩亚洲| 国产精品一区二区av片| 1区2区3区4区产品不卡码网站 | 国精品午夜福利视频不卡| 精品无码久久久久久尤物| 99国内精品久久久久久久|