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

力扣面试150题--二叉树的最近公共祖先

Day 53

题目描述

在这里插入图片描述

思路

初次思路:转化为中序和后序来找祖先,具体见代码。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<TreeNode>hou;public List<TreeNode>mid;public Map<TreeNode,Integer>midhao;public Map<TreeNode,Integer>houhao;int i=0;int j=0;public void houpai(TreeNode root){if(root==null){return;}houpai(root.left);houpai(root.right);hou.add(root);//保存到后序遍历数组中houhao.put(root,j);//记录序号j++;}public void midpai(TreeNode root){if(root==null){return;}midpai(root.left);mid.add(root);//保存在中序遍历数组midhao.put(root,i);//记录序号i++;midpai(root.right);}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {hou=new ArrayList<TreeNode>();mid=new ArrayList<TreeNode>();midhao=new HashMap<TreeNode,Integer>();houhao=new HashMap<TreeNode,Integer>();houpai(root);midpai(root);int houp,midp;int houq,midq;houp=houhao.get(p);midp=midhao.get(p);//找到p在后序和中序遍历的序号houq=houhao.get(q);midq=midhao.get(q);//找到q在后序和中序遍历的序号i=houhao.get(root);j=midhao.get(root);//找到根在后序和中序遍历的序号int midbeg,midend,houbeg,houend;midbeg=0;//某一子树中序遍历的起点midend=mid.size()-1;//某一子树中序遍历的终点houbeg=0;//某一子树后序遍历的起点houend=hou.size()-1;//某一子树后序遍历的终点while(true){if((midq<=j&&midp>=j)||(midq>=j&&midp<=j)){//在同一子树就可以输出了return mid.get(j);}else{if(midq<j&&midp<j){//都在左子树//更新到左子树,排除掉所有的右子树midbeg=midbeg;int x=midend-j;//右子树的节点数midend=j-1;houbeg=houbeg;houend=houend-x-1;root=hou.get(houend);j=midhao.get(root);//更新根节点的序号}else{//都在右子树//更新到右子树,排除到所有的左子树int x=j-midbeg;//左子树的节点个数midbeg=j+1;midend=midend;houbeg=houbeg+x;houend=houend-1;root=hou.get(houend);j=midhao.get(root);//更新根节点的序号}}}
}
}

题解思路:我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。

class Solution {Map<Integer, TreeNode> parent = new HashMap<Integer, TreeNode>();Set<Integer> visited = new HashSet<Integer>();public void dfs(TreeNode root) {//存储到hash表中每个节点的父节点if (root.left != null) {parent.put(root.left.val, root);dfs(root.left);}if (root.right != null) {parent.put(root.right.val, root);dfs(root.right);}}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root);while (p != null) {visited.add(p.val);//将p的父节点不断加入到set中p = parent.get(p.val);}while (q != null) {if (visited.contains(q.val)) {//从q开始向上找父节点,如果找到第一个v存在于p的父节点集合SET说明就找到了二叉树的最近公共祖先return q;}q = parent.get(q.val);//接着找父节点}return null;}
}
http://www.xdnf.cn/news/9530.html

相关文章:

  • 【Java工程师面试全攻略】Day3:Java并发编程面试精要
  • Linux系统中使用find命令自动清理过期备份文件的完整指南
  • 【Python】 -- 趣味代码 - 佩奇
  • 【数据结构初阶】顺序表的应用
  • 【 java 基础问题 第二篇 】
  • Bitset
  • SAR ADC 比较器的响应设计
  • 如何从经纬度数据中判断哪个是经纬度
  • 第二十一章:数据治理之数据安全:数据安全的驱动因素以及常见的数据安全举措
  • 一对多 多对一
  • 调制与解调技术科普|通信系统是如何传送信息?如何还原出原始信息?【无线通信小百科】
  • 【贪心 逆向思考 并集查找 数学归纳法】P7162 [COCI 2020/2021 #2] Sjekira|普及+
  • 【RP2350】香瓜树莓派RP2350之USB HID
  • 《P1763 埃及分数》
  • Acrobat Reader 无法在 Windows 11及10 中打开的5种修复方法
  • 数据库表添加索引
  • STM32 Modbus RTU从机开发实战:核心实现与五大调试陷阱解析
  • 什么是Windows内存压缩? win10/11系统启用和禁用内存压缩的教程
  • HTB-Puppy
  • DAY 38 Dataset和Dataloader类
  • Linux网络编程(一)
  • 医疗影像检测系统设计与实现
  • open3d保存为pcl可以读取的ply点云
  • Windows 子系统 WSL 中宝塔安装 supervisor 启动失败解决方案
  • 《计算机组成原理》第 1 章 - 计算机系统概论
  • 工控安全审计与网络流量监控系统的协同防御
  • ‌CDGP|企业数据治理:莫让“打补丁”成为常态
  • STL容器使用中的常见问题解析
  • 辛格迪客户案例 | 博福-益普生实施YonSuite,同步开展计算机化系统验证(CSV)
  • Druid连接池使用和源码分析