leetcode236二叉树的最近公共祖先 中等

在这里插入图片描述

思路

采用路径解决问题。路径之和||
先序遍历的算法:求p节点路径,求q节点路径,画出来,遍历两个路径,相同的节点都是公共祖先,离根最远的就是最后一个相同的节点,就是最近公共祖先

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
   TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
       std::vector<TreeNode*> path;//声明遍历用的临时栈
       std::vector<TreeNode*> node_p_path;
       std::vector<TreeNode*> node_q_path;//声明存储p和q的路径
       int finish = 0;
       preorder(root, p, path, node_p_path, finish);
       path.clear();
       finish = 0;
       preorder(root, q, path, node_q_path, finish);
       int path_len = 0;
       if(node_p_path.size() < node_q_path.size()){
           path_len = node_p_path.size();
       }
       else{
           path_len = node_q_path.size();
       }
       TreeNode *result = 0;
       for(int i = 0; i < path_len; i++){
           if(node_p_path[i] == node_q_path[i]){
               result = node_p_path[i];
               //这里实现返回离根最远的公共点,使用相等就覆盖实现的
           }
       }
       return result;
   }
private://本题与113不同之处在于本题只需要求到给定节点路径即可,node是正在遍历的节点
   void preorder(TreeNode *node,TreeNode *search,//search就是给定的条件,搜索到这个节点
                 std::vector<TreeNode*> &path,//遍历时节点路径栈
                 std::vector<TreeNode*> &result,//最终搜索到search的路径结果
                 int &finish){
       if(!node || finish){//当node为空或者找到了search节点返回
           return;
       }
       path.push_back(node);
       if(node == search){
           finish = 1;
           result = path;//注意这里的result与path都是一维数组
       }//先序遍历操作:节点push栈,找到了finish为1,同时path送给result
       preorder(node->left,search, path, result, finish);
       preorder(node->right,search, path, result, finish);
       path.pop_back();//相当于遍历到底再返回便于继续遍历,脑中有图即可理解
   }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值