当前位置: 首页 > news >正文

剑指offer——JZ68 二叉搜索树的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求

二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)

题目描述

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

1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.

2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值

3.所有节点的值都是唯一的。

4.p、q 为不同节点且均存在于给定的二叉搜索树中。

数据范围:

3<=节点总数<=10000

0<=节点值<=10000

如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:

示例

示例1:

输入:{7,1,12,0,4,11,14,#,#,3,5},1,12

返回值:7

说明:节点1 和 节点12的最近公共祖先是7

示例2:

输入:{7,1,12,0,4,11,14,#,#,3,5},12,11

返回值:12

说明:因为一个节点也可以是它自己的祖先.所以输出12


二、解题思路

根据题目要求,需要我们在给定的二叉树中,找到所给出的两个结点的最近公共祖先。

思路很简单,就是我们从根节点开始分别去找到所给出的两个结点,并且记录根结点分别到两个结点的路径,然后比较这两条路径,路径中最后一个相同的结点就是两个结点最近的公共结点。其中路径的查找则可以利用二叉搜索树的性质,左子树都比根结点小,右子树都比根结点大,将所给定结点的值与根结点比较从而找到所给结点即可,路径则记录在vector中。

题目说了节点数量>=3,因此我们不需要判断树是否为空。

首先求出根结点到对应两个结点的路径;

利用for循环遍历两个路径,找到最后一个相同的结点,最后返回即可。


三、具体代码

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @param p int整型 * @param q int整型 * @return int整型*/vector<int> getPath(TreeNode* root,int x){vector<int> path;TreeNode* p=root;while(p->val!=x){path.push_back(p->val);if(x<p->val) p=p->left;else p=p->right;}path.push_back(p->val);return path;}int lowestCommonAncestor(TreeNode* root, int p, int q) {//找到根结点到目标结点的路线vector<int> path_p=getPath(root,p);vector<int> path_q=getPath(root,q);int res=0;//最后结果for(int i=0;i<path_p.size()&&i<path_q.size();i++){//最后一个相同的结点就是最近的公共祖先if(path_p[i]==path_q[i])  res=path_p[i];else  break;}return res;}
};

http://www.lryc.cn/news/186725.html

相关文章:

  • [Spring] @Bean 修饰方法时如何注入参数
  • docker拉取镜像错误 missing signature key
  • 基于可解释性特征矩阵与稀疏采样全局特征组合的人体行为识别
  • OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换
  • http.header.Set()与Add()区别;
  • vue-7-vuex
  • SSO单点登录和OAuth2.0区别
  • 【轻松玩转MacOS】基本操作篇
  • 华为ICT——第三章图像处理基本任务
  • (C++)引用的用法总结
  • Charles:移动端抓包 / windows客户端 iOS手机 / 手机访问PC本地项目做调试
  • 【AI】深度学习——人工智能、深度学习与神经网络
  • RK3288:BT656 RN6752调试
  • LLMs 蒸馏, 量化精度, 剪枝 模型优化以用于部署 Model optimizations for deployment
  • Milvus踩坑笔记
  • 什么是轴电流?轴电流对轴承有什么危害?
  • react create-react-app v5配置 px2rem (不暴露 eject方式)
  • .net中用标志位解决socket粘包问题
  • 【Ubuntu】Systemctl 管理 MinIO 服务器的启动和停止
  • 《golang设计模式》第二部分·结构型模式-07-代理模式(Proxy)
  • Jmeter常用线程组设置策略
  • 【Spring】Spring MVC 程序开发
  • 如何在企业网站里做好网络安全
  • windows server 2012 服务器打开系统远程功能
  • 智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC
  • GPT的优势和GPT缺点
  • 微信小程序开发缺少中间证书问题(腾讯云、阿里云等做服务器)
  • 动态代理初步了解
  • QT国际化
  • 微信小程序button按钮去除边框去除背景色