二叉搜索树的最近公共祖先、二叉树的最近公共祖先

2024-06-12 10:38

本文主要是介绍二叉搜索树的最近公共祖先、二叉树的最近公共祖先,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录


  1. 二叉搜索树的最近公共祖先(力扣:235)
  2. 二叉树的最近公共祖先(力扣:236)

二叉搜索树的最近公共祖先

题目

二叉搜索树的最近公共祖先(力扣:235)

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

分析

利用二叉搜索树的特性,左子树节点都小于根节点,右子树节点都大于根节点。

  1. 当两个子节点都大于根节点时,则在右子树查找。
  2. 当两个子节点都小于根节点时,则在左侧查找。
  3. 否则,找到了最近的公共祖先了。
代码实现
    /*** 235. 二叉搜索树的最近公共祖先* @param root* @param p* @param q* @return*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root.val > p.val && root.val >q.val){return lowestCommonAncestor(root.left, p, q);}if (root.val < p.val && root.val < q.val){return lowestCommonAncestor(root.right, p, q);}return root;}

二叉树的最近公共祖先

题目

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

分析

可以使用递归来实现:

  1. 当root为null或者root等于两个节点中的一个时,返回root节点。
  2. 递归获取左节点和右节点。
  3. 当左节点和右节点都不为空时,代表指定的两个节点都在以root为根节点的树上,这时直接返回root即可。
  4. 如果左节点或右节点中有一个不为null,则返回该节点。
  5. 否则,代表左右节点中都没有要查找的节点,则返回null。
代码实现
    /*** 236. 二叉树的最近公共祖先* @param root* @param p* @param q* @return*/public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q){return root;}TreeNode left = lowestCommonAncestor2(root.left, p, q);TreeNode right = lowestCommonAncestor2(root.right, p, q);if (left != null && right != null){return root;}else if (left != null){return left;}else if (right != null){return right;}return null;}

这篇关于二叉搜索树的最近公共祖先、二叉树的最近公共祖先的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053981

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT