Lettcode之 二叉樹的最近公共祖先

簡要題解:

遞歸解法找到兩個節點分別是在左子樹還是在右子樹中 要是分別在左右子樹中根節點即爲最近公共祖先要是都在左子樹即是遞歸返回來左節點爲最近公共祖先節點,要是都在右子樹跟其一致。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)return NULL;
        if(root==p||root==q)
        {
            return root;
        }
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left!=NULL&&right!=NULL) return root;
        if(left!=NULL) return left;
        if(right!=NULL)return right;
        return NULL;
    }
};

非遞歸解法

找到兩個節點的簡單路徑後直接比較兩個節點的路徑即可

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
     bool dfs(TreeNode* root,TreeNode *m,vector<TreeNode*>&pa)
     { 
          if(root==NULL) return false;
          pa.push_back(root);
          if(root==m) return true;
          bool  flag=true;
          flag=dfs(root->left,m,pa);
          if(!flag)
          flag=dfs(root->right,m,pa);
          if(!flag)
          pa.pop_back();
          return flag;
     }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
              vector<TreeNode* >p1;
              vector<TreeNode* >p2;
              dfs(root,p,p1);
              dfs(root,q,p2);
              TreeNode* ans=root;
              for(int i=0;i<min(p1.size(),p2.size());i++)
              {
                  if(p1[i]==p2[i])
                  {
                      ans=p1[i];
                  } else break;
              }
              return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章