【LeetCode 43】236.二叉树的最近公共祖先

简介: 【LeetCode 43】236.二叉树的最近公共祖先

一、题意

二、解答过程

**思路/方法:**该题用到自底向上查找------回溯!还要用到递归!

如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。

使用后序遍历,回溯过程,就是从低向上遍历节点,一旦发现这个条件的节点,就是最近公共节点。

  • 先找节点路径p和q
  • 在结点路径的最近公共祖先节点

递归三部曲里的逻辑处理:

//
 //3.遍历整棵树
        TreeNode *left=lowestCommonAncestor(root->left,p,q);
        TreeNode *right=lowestCommonAncestor(root->right,p,q);

递归函数有返回值时:

  • 搜索一条边:
if (递归函数(root->left)) return ;
if (递归函数(root->right)) return ;
  • 搜索整棵树:
left = 递归函数(root->left);
right = 递归函数(root->right);
left与right的逻辑处理;

在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)

class Solution {
public://1.
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
       //2.如果找到了节点p或者节点q或者遇到了空节点。就返回
        if(root==q||root==p||root==NULL) return root;
        //3.遍历整棵树
        TreeNode *left=lowestCommonAncestor(root->left,p,q);//不断遍历左子树
        TreeNode *right=lowestCommonAncestor(root->right,p,q);//不断遍历右子树
        //讨论情况:
        if(left!=NULL&&right!=NULL) return root;
        if(left==NULL&&right!=NULL) return right; 
        else if(left!=NULL&&right==NULL) return left;
        else{//left==NULL&&right==NULL
            return NULL;
        }
    }
};


目录
相关文章
|
2月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
20 2
|
2月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
18 2
|
2月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
18 2
|
2月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
19 1
|
2月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
2月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
20 0
|
2月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
21 0
|
2月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
19 0
|
4月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行