[剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

【问题描述】[中等]

235/68-1 搜索二叉树 236/68-2 二叉树
在这里插入图片描述

【解答思路】

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

递归

时间复杂度:O(N) 空间复杂度:O(N)
在这里插入图片描述

情况 1. , 2. , 3. , 4. 的展开写法如下。

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || 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 null; // 1.if(left == null) return right; // 3.if(right == null) return left; // 4.return root; // 2. if(left != null and right != null)}
}

优化版

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if(left == null) return right;if(right == null) return left;return root;}
}

注释版

//方法二:后序遍历,先左子树后右子树最后root,从底至顶回溯,代码简单,但是分析起来复杂;//当root==null时,说明当前路径没有找到p或者q//当root==p||root==q,假设先找到的是节点p://则继续从找到的节点p开始寻找另一个节点q(迭代),当第二个节点q也找到时,进行回溯,一开始回溯时,会一直保持单侧子树不为null的情况,但是注意这种情况,不是由于p,q均在当前单侧子树造成的,当前回溯过程的单侧子树内只有一个q;//继续回溯,当回溯至一个节点root时,节点 p,q在节点root的异侧,即双侧子树均不为null时,节点 root即为最近公共祖先。//返回root,后续则又会变为单侧子树不为null,这时才是因为p,q均在当前单侧子树造成的;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//root=null,返回root说明这条路径没有找到p或者q;root=p||root=q时说明当前找到了p或者q;if(root==null||root==p||root==q) return root;TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);//后面是回溯过程,下面三个if语句可以交换顺序,如果固定顺序,则后面两个if可以进行简化//当root的左子树和右子树都没有p或者q时,root不是p和q祖先,返回null;if(left==null&&right==null) return null;//基于第一个if,这里的if可以简写为if(right==null) return left;//这里root的右子树没有找到p或者q,left找到了p或者q,这里返回的left有两种情况://1.未找到最近公共节点时,即还在迭代阶段,这里返回的left为找到的p(假设为p),即第一个if的return结果://若前面没有找到q,则从p开始继续进行迭代,在二叉树中剩余的节点中找到剩下的那个q;  若之前已经找到了q,则开始返回,直到找到left!=null&&right!=null,即找到了最近公共祖宗;//2.找到最近公共节点时,即处于返回阶段,不需要再进行迭代了,此时p,q在同一侧子树中,这里left为找到的最近公共节点,即下面最后一个return的结果;if(left!=null&&right==null) return left;//基于第一个if,这里的if可以简写为if(left==null) return right;//这里的分析和上面一个if类似;if(left==null&&right!=null) return right;return root;//即if(left!=null&&right!=null) return root;但注释中的写法会使得函数缺少return语句;}

【总结】

1. 二叉树遍历

前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据

2. 对于二叉树的题,开始可以用递归的思想去思考单 代码简单 过程不简单
3. 相关题目[剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

作者:Krahets
转载链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-er-cha-shu-de-zui-jin-gong-gon-7/

参考链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-javashi-xian-jian-zhi-offersi-lu/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 查看镜像信息

Docker 查看镜像信息 原文:Docker 查看镜像信息文章首发个人网站: https://www.exception.site/docker/docker-look-up-image-info 本文中,我们将需要学习 Docker 如何查看镜像信息? 一、images 命令列出镜像 通过使用如下两个命令&#xff0…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题

这篇是密码学52件事中第7篇.我们只要把问题集中在BPP复杂类问题. 目前为止,我们已经介绍了一些复杂类: P 是一类能在多项式时间内被可确定的图灵机判定的问题.NP是一类能在多项式时间内被非确定的图灵机判定的问题.BPP是一类在多项式时间内被概率图灵机解出的问题,并且对所有…

73 forward动作

定义一个logind的jsp页面 <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert tit…

Linux系统开发之路 - 下

5、Ubuntu安装好之后&#xff0c;就可以进行开发环境的搭建。&#xff08;坚持看完有彩蛋&#xff0c;(>--..--<).jpg&#xff09;。 1&#xff09;首先安装Nodejs和Npm。 打开浏览器输入nodejs.org&#xff0c;进入页面会提示下载&#xff0c;如下图&#xff0c;选择LTS…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第8篇]交互式的定义如何帮助计算和IP类问题是什么

这是系列中的第8篇&#xff0c;我们主要讨论计算中交互作用的用处和IP类问题是什么. 什么是证明 经典的证明 交互式证明系统 [1] http://dl.acm.org/citation.cfm?id63434 [2] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642 [3] h…

线段树之扫描线思路

运用线段树扫描线方式可以解决经典的求矩形面积交问题以HDU_1542 Atlantis 题为例 线段树和扫描线是这么结合的线段树统计的是有效区间段的长度 也就是扫描线 当前扫描到的区间段是哪一个 什么意思 比如当前在哪一个段扫描 那么线段树中的t[1]中的len就是多长 线段树一般…

74 param动作

定义一个logind的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title h…

Unknown column 'user_uid' in 'field list' sql错误解决过程

在idea中运行一直有错&#xff0c;找了好多个地方都找不到&#xff0c;以为是我的字段名字写错了&#xff0c;然而都是对的。 把错误的这个字段删了再打一遍就好了&#xff0c; 转载于:https://www.cnblogs.com/zxrxzw/p/10630164.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第9篇]香农对熵和信息的定义是什么?

这是计算机理论的最后一篇.我们讨论信息理论的基础概念,什么是香农定义的熵和信息. 熵 熵与确定性成反比 信息 密码学实例 [1] Thomas M. Cover and Joy A. Thomas. Elements of Information Theory ​ 2nd Edition. Wiley-Interscience, 2 edition, July 2006. [2] S. Vaj…

数据结构:(5)算法分析基础

算法时间复杂度分析 算法空间复杂度分析

蠢货别忘(一)common lisp funcall

自定义 cons&#xff0c;car&#xff0c;cdr Scheme 示例&#xff1a; (define (my_cons x y) (lambda (z) (z x y))) (define (my_car m) (m (lambda (p q) p))) (define (my_cdr m) (m (lambda (p q) p))) Common Lisp&#xff1a; (defun my_cons (x y) (lambda (z) (funcal…

[Leetcode][第35题][JAVA][搜索插入位置][二分法]

【问题描述】[中等] 【解答思路】 二分法 时间复杂度&#xff1a;O(LogN) 空间复杂度&#xff1a;O(1) public class Solution {public int searchInsert(int[] nums, int target) {int len nums.length;if (len 0) {return 0;}// 特判if (nums[len - 1] < target) {re…

数据结构:(6)其他情况的算法分析

最好&#xff0c;最坏,平均复杂度分析 递归算法的时间复杂度分析

树状数组的区间修改+查询

首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] Sigma a[i] Sum(bit[x]&#xff09; 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 这样的话也就是最del[i]求前缀和 就能得到i~n的所有修改了 因为i前的每一个元素的修改都是对后面…

scrapy爬虫系列之五--CrawlSpider的使用

功能点&#xff1a;CrawlSpider的基本使用 爬取网站&#xff1a;保监会 主要代码&#xff1a; cf.py # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import reclass CfSpider(CrawlSp…

洛谷P4718 【模板】Pollard-Rho算法

虽然很久以前就听说过PR算法&#xff0c;但前几天第一次打。 首先miller rabin判断素数&#xff0c;不在复杂度瓶颈。 pollard rho倍增环长&#xff0c;复杂度是\(O(n^{\frac{1}{4}} log n)\)的。 然而这样复杂度较高&#xff0c;比较难过加强后的数据。 可以考虑每次倍增时把乘…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第10篇]RSA和强RSA问题有什么区别

这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于这样的假设,某些数学问题难以在有限的时间内解决.让我们看公钥(非对称)密码学,这也是这篇文章中我们使用的一个假设----**单向函数(O…

Palindrome subsequence HDU - 4632 区间dp|记忆化搜索

// 区间dpimport java.util.Scanner;/**** author CN*/ public class main {static int mod 10007;static String l;static int[][] dp new int[1010][1010];public static void main(String[] args){// TODO code application logic hereint t;Scanner sc new Scanner(Syst…

课外阅读(通讯技术的发展史)

课外阅读&#xff08;通讯技术的发展史&#xff09; 人们常把有线固定通信和无线移动通信作为信息基础结构&#xff08;NII/GII&#xff09;的两大组成部分。近年来它们都以明显的快速步伐向前推进&#xff0c;而且进入新世纪后将更加快速发展&#xff0c;为兴旺的信息时代作出…