剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

题目:

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

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

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

 

示例 1:

2 
8 
6

示例 2:

2
4
2

 

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

代码:

//此方法不只是求解二叉搜索树时可用,非搜索树也可

复制代码
 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     //记录路径和是否已找到要找的结点
12     static ArrayList<TreeNode> arrayList=new ArrayList<>();
13     static  boolean bool=false;
14     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
15         //每次遍历寻找都要的重置
16         arrayList.clear();
17         bool=false;
18 
19         backTrack(root,p);
20         List<TreeNode> list1=new ArrayList<>(arrayList);
21         
22         arrayList.clear();
23         bool=false;
24         
25         backTrack(root,q);
26         List<TreeNode> list2=new ArrayList<>(arrayList);
27         int len1=list1.size();
28         int len2=list2.size();
29         int i=0;
30         //找到的第一个不同说明上一个是最后一个共同结点,如果某一方遍历结束还是都相同,那么结束的一方是未结束一方的父节点,只需要输出结束一方的尾节点
31         for ( i = 0; i <len1&&i<len2 ; i++) {
32             if(list1.get(i)!=list2.get(i)){
33                 return list1.get(i-1);
34             }
35         }
36         if(i==len1){
37             return list1.get(len1-1);
38         }else{
39             return list2.get(len2-1);
40         }
41     }
42     //寻找从根抵达目标节点的路径方法
43     public  static void backTrack(TreeNode root,TreeNode p){
44         if(bool!=true) {
45             if (root == p) {
46                bool=true;
47                arrayList.add(root);
48             }else{
49                 arrayList.add(root);
50                 if(root.left!=null&&bool!=true){
51                     backTrack(root.left,p);
52                 }
53                 if(root.right!=null&&bool!=true){
54                     backTrack(root.right,p);
55                 }
56                 if(bool!=true){
57                     arrayList.remove(root);
58                 }
59 
60             }
61 
62         }
63     }
64 
65 }
复制代码

 

 

代码:

//此方法来自题解

复制代码
 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {  
11 
12     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
13         
14         if(root==null){return null;}
15         if(root.val<p.val&&root.val<q.val){
16             return lowestCommonAncestor(root.right,p,q);  
17         }
18         if(root.val>p.val&&root.val>q.val){
19             return lowestCommonAncestor(root.left,p,q);  
20         }
21         return root;
22     }
23 
24 }
复制代码

 

 

posted @   堤苏白  阅读(50)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示