首页 > 其他分享 >二叉树的公共祖先

二叉树的公共祖先

时间:2024-01-17 12:34:02浏览次数:37  
标签:leftflag return 祖先 else 二叉树 公共 TreeNode root rightflag


最开始做的时候,就先想到的是找父节点的那个函数,于是先把目标节点的所以祖先节点存起来,然后一个一个进行比对,当然这样耗时很大。

点击查看代码
class Solution {
public:
vector<TreeNode*>vp,vq;
TreeNode*findfa(TreeNode*root,TreeNode*k){
    if(!root){return NULL;}
if(root==k||root->left==k||root->right==k){return root;}
TreeNode*mleft=findfa(root->left,k);
if(mleft){return mleft;}
else{return findfa(root->right,k);}
return NULL;
}

void allfa(TreeNode*root,TreeNode*k,vector<TreeNode*>&cnt){
    if(root==k){
        cnt.push_back(k);
        return ;
    }
cnt.push_back(k);
allfa(root,findfa(root,k),cnt);
}
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
allfa(root,p,vp);
allfa(root,q,vq);
for(int i=0;i<vp.size();i++){
    for(int j=0;j<vq.size();j++){
        if(vp[i]==vq[j]){return vp[i];}
    }
}
return NULL;
    }
};

后面看了卡哥的方法,虽然有点难想,但还是可以学习模仿。
一般的题目是从根节点开始往叶节点去找,但这题要求是要从叶节点往根节点找,把目标节点不断往上传递。这就显然要用后序遍历了。
两步走,终止条件,单层递归逻辑
终止条件,就想三个节点。

点击查看代码
  if(!root){return NULL;}
        if(root==p||root==q){return root;}
单层递归逻辑中的左右根,关于根的处理就是关键了。 一般是左右结果先收集起来,然后再在根中进行处理,这就有四种情况。
点击查看代码
if(leftflag&&rightflag){return root;}
        else if(!leftflag&&rightflag){return rightflag;}
        else if(leftflag&&!rightflag){return leftflag;}
        else{return NULL;}

完整代码

点击查看代码
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root){return NULL;}
        if(root==p||root==q){return root;}
       TreeNode*leftflag=lowestCommonAncestor(root->left,p,q);
        TreeNode*rightflag=lowestCommonAncestor(root->right,p,q);
        if(leftflag&&rightflag){return root;}
        else if(!leftflag&&rightflag){return rightflag;}
        else if(leftflag&&!rightflag){return leftflag;}
        else{return NULL;}
       
    }
};

标签:leftflag,return,祖先,else,二叉树,公共,TreeNode,root,rightflag
From: https://www.cnblogs.com/yun-che/p/17969754

相关文章

  • 代码随想录 day21 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
    二叉搜索树的最小绝对差二叉搜索树就是有序数组那么转换一下就很简单了也可以直接在遍历二叉搜索树的时候进行比较需要一个指针记录前一个节点二叉搜索树中的众数既可以把这题的二叉搜索树当成一般树来做这样就是层序遍历树然后用map记录频率再取频率最高的值这里用......
  • 关于二叉树递归代码的粗鄙理解
    整体来看,二叉树的递归代码,可以分为终止条件,单层递归逻辑。单层递归逻辑就是所谓的根左右那三种,选哪一种也是有讲究的,如果不需要对根节点进行处理,那三种都可以。如果题目侧重与由子节点推到父节点,就采用后序遍历。如果题目侧重与由父节点推到子节点,就采用前序遍历。终止条件怎......
  • 代码随想录 day20 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
    最大二叉树前序遍历递归效率不高因为每次都要新开数组给左右子树可以在同一个数组上做这个事情合并二叉树一开始不知道怎么同时遍历两棵树其实只要同时传入两棵树的节点就可以了这里判断两棵树谁空就另外一个作为构造树全为空那就会构造空节点二叉搜索树中的搜索......
  • 非递归形式遍历二叉树
    最简单的就是前序遍历,每次将栈顶元素插入数组中。但要注意由于栈的性质,先push右节点再push左节点。点击查看代码classSolution{public:vector<int>preorderTraversal(TreeNode*root){vector<int>v;stack<TreeNode*>stk;if(root!=NULL){stk.push(root);}while(!......
  • 一套模板搞定二叉树算法题--二叉树算法讲解002
    1、二叉树的递归递归:2、二叉树遍历之DFS深度优先遍历2.1、遍历的概念每个节点都要恰好被访问一次,本质上是二叉树的线性化。一个树形的结构,线性化为一个数组之类的"串"的结构。2.2、DFS深度优先遍历示例二叉树原型图:2.2.1、前序遍历前序遍历执行顺序:根节点--对左子......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的直径
    题目给你一棵二叉树的根节点,返回该树的直径。二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点root。两节点之间路径的长度由它们之间边数表示。 示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或[5,2,1,......
  • 代码随想录 day18 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树
    找树左下角的值最简单就是想到层序遍历之后取第一个位置元素就是了递归的话需要先判断哪里最深的节点至于最左保持中左右的遍历顺序第一次得到最大深度处就是最左的路径总和有点像查找子树路径所以递归回溯是比较好的选择在求路径的适合,targetSum-node->val是否为......
  • NC66 两个链表的第一个公共结点
    https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=117&rp=1&ru=%2Fexam%2Foj&qru=%2Fexam%2Foj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D117&difficulty=&j......
  • 开发日记2(公共类)
    没想到尽然开始了我的java成长之路。之前专注数据库方面,主要做bi业务分析、近几年很多精力又用到需求分析和项目管理上,学过C,但没用过,java看了半本书,但始终没有跨出实战的那一步近两年因为大数据复杂集成项目管理的原因,入了java坑。一点也不会,容易被糊弄,也没办法真正在技术层面去理......
  • 代码随想录 day17 平衡二叉树 二叉树的所有路径 左叶子之和
    平衡二叉树之前一直写迭代代码没有怎么写递归正好这题不是很好写迭代练习一下递归这题递归逻辑相对简单左右子树高度差判断是不是大于一可以直接返回结果不大于一就高度max(l,r)+1二叉树的所有路径关键要点这题适合先序遍历回溯过程和递归过程是一起写的进来几次......