力扣236. 二叉树的最近公共祖先(java DFS解法)

news/2024/7/20 20:35:25 标签: leetcode, java, 深度优先

Problem: 236. 二叉树的最近公共祖先

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

思路

首先我们要注意到题目所给提示**二叉树的所有节点值均不相等!!!**在此基础上我们可以得到二叉树的最近公共祖先唯一存在如下两种情况:

1.若当前节点的左子树和右子树均存在给定节点的其一,则当前节点为最近公共祖先;
2.若当前节点等于所给节点的其中一个,同时当前节点的左子树或者右子树中存在所给节点的另一个节点,则当前节点为最近公共祖先

如下图示:
image.png
image.png

解题方法

1.定义一个TreeNode类型的指针命名为location用于记录并返回最后的最近公共祖先
2.递归后续遍历二叉树,记录当前节点(包括当前节点)的左子树或右子树节点等于给定节点的个数
3.判断当前节点是否等于给定节点中其一,同时其左右子树中等于给定节点的个数(具体的判定条件看思路)判定成立时将指针location指向当前节点。
4.注意若在递归过程中发现指针location已经不为null则直接退出递归

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

java">/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //用于记录指定节点最近的父节点位置
    private TreeNode location = null;
   /**
     * 求取二叉树中指定两节点的最近公共父节点(二叉树任意节点值无重复)
     *
     * @param root 树的根节点
     * @param p    指定节点p
     * @param q    指定节点q
     * @return TreeNode
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        depthFirstSearch(root, p, q);
        return location;
    }

    /**
     * 深度优先(此处为二叉树的后序遍历)求取某一节点指定的
     * 节点p 与 q的个数,利用其找到最近父节点的位置
     * @param root 树的根节点
     * @param p    指定节点p
     * @param q    指定节点q
     * @return int
     */
    private int depthFirstSearch(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return 0;
        }
        //当前节点左子树包含p,q节点的个数
        int leftContains = depthFirstSearch(root.left, p, q);
        //当已经找到location时提前退出
        if (location != null) {
            return 2;
        }
        //当前节点右子树包含p,q节点的个数
        int rightContains = depthFirstSearch(root.right, p, q);
        if (location != null) {
            return 2;
        }
        //记录当前节点值等于q或p
        int rootContain = 0;
        //如果当前节点值等于p,q其一
        if (root == p || root == q) {
            rootContain = 1;
        }
        /*
        找到情况1:当当前节点值等于p,q其一时,同时当前节点的左子树
                 或右子树包含q,p的个数为1
        找到情况2:当当前节点的左子树包含一个p或q其一,同时当前节点
                 的右子树包含一个q或p其一
         */
        if (rootContain == 1 && (leftContains == 1 || rightContains == 1)) {
            location = root;
        }
        if (rootContain == 0 && leftContains == 1 && rightContains == 1) {
            location = root;
        }
        return leftContains + rightContains + rootContain;
    }
}

http://www.niftyadmin.cn/n/5210790.html

相关文章

基于springboot实现校园在线拍卖系统项目【项目源码】

基于springboot实现校园在线拍卖系统演示 Javar技术 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&…

Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和

进入贪心了&#xff0c;我觉得本专题是最烧脑的专题 Leetcode 455. 分发饼干 题目链接 455 分发饼干 让大的饼干去满足需求量大的孩子即是本题的思路&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…

【数据分享】我国12.5米分辨率的DEM地形数据(免费获取/地理坐标系)

DEM地形数据是我们在各种研究和设计中经常使用的数据&#xff01;之前我们分享过500米分辨率的DEM地形数据、90米分辨率的DEM地形数据、30米分辨率的DEM地形数据&#xff08;均可查看之前的文章获悉详情&#xff09;。 本次我们为大家带来的是分辨率为12.5m的DEM地形数据&#…

【浏览器】录音open失败:浏览器禁止不安全页面录音,可开启https解决..

在浏览器地址栏中输入&#xff1a;chrome://flags/#unsafely-treat-insecure-origin-as-secure 启动选项&#xff0c;并且添加你本地的开发地址

140. 单词拆分 II

140. 单词拆分 II Java错误代码&#xff1a;不该回溯数组的&#xff0c;回溯数组是以固定顺序来的&#xff0c;应该回溯字符串&#xff01; class Solution {StringBuilder sb;List<String> list;List<String> tmp;private String getString() {StringBuilder str…

77 组合问题

给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 class Solution { private: vector<vector<int>> result; // 存放符合条件结果的集合 vector<int> path; // 用来存放符合条件结果 void backtracking(int n, int k , int st…

安装电脑监控软件后,会影响其他程序运行吗?

随着现代科技的迅速发展&#xff0c;电脑屏幕的使用管控越来越是受重视。电脑监控软件可以监控终端电脑的一切操作&#xff0c;发现许多潜在风险&#xff0c;并及时采取措施&#xff0c;有效地管理和保护企业信息安全系统。在终端电脑安装电脑监控软件后&#xff0c;会影响其他…

链式基数排序

实现链式基数排序&#xff0c;待排序关键字n满足1≤n≤1000&#xff0c;最大关键字数位≤5。 输入样例&#xff1a; 第一行输入待排序个数n&#xff08;1≤n≤1000&#xff09;,再输入n个数(n的数位≤5)。 输出样例&#xff1a; 输出每趟分配-收集后链表中的关键字&#xff0…