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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值