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

Java找二叉树的公共祖先

描述:

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

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

方法一:

思路情况一p或者q其中一个是root,直接返回root;情况二,p或者q分别在root的左右子树上,递归找到root,情况三,p和q都在左子树或右子树上,这样有可能是递归后得到的情况一,或者是递归后的情况二

//给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。前提:q!=p
//https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/
//思路:情况一p或者q其中一个是root,直接返回root;情况二,p或者q分别在root的左右子树上,递归找到root,
//情况三,p和q都在左子树或右子树上,这样有可能是递归后得到的情况一,或者是递归后的情况二
//csdn:
public class Test4 {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(p==root || q==root)return root;//情况一和情况二if (root==null)return null;TreeNode rootleft=lowestCommonAncestor(root.left,p,q);TreeNode rootright=lowestCommonAncestor(root.right,p,q);//情况三if(rootleft!=null && rootright!=null)return root;//情况三下的情况二//p和q都在左子树或右子树上,else if(rootleft!=null && rootright==null)return rootleft;else if(rootleft==null && rootright!=null)return rootright;return null;//没有找到}}

方法二 

思路我们用两个栈分别存储root到p和q经过的节点路径,当递归到某个节点时,这个节点的左右子树都没有p或者q,说明该节点不是路径上的节点,出栈,两个栈存储完毕后保证两个栈的大小长度一样,一块出栈,当出栈元素相同时就是交点
 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;Stack<TreeNode> stack_q=new Stack<>();Stack<TreeNode>stack_p=new Stack<>();getStack(root,stack_p,p);//寻找从根节点到p节点路径getStack(root,stack_q,q);//寻找从根节点到q节点路径int size_p=stack_p.size();int size_q=stack_q.size();//保证连个栈的长度一样if(size_p>size_q){for (int i = 0; i < size_p-size_q; i++) {stack_p.pop();}} else if (size_p<size_q) {for (int i = 0; i < size_q - size_p; i++) {stack_q.pop();}}//一块出一个元素,当元素相同时就是交点while (stack_p!=null){if(stack_p.peek()==stack_q.peek())return stack_p.pop();else {stack_p.pop();stack_q.pop();}}return root;}public boolean getStack (TreeNode root,Stack<TreeNode> stack,TreeNode key){if(root==null)return false;stack.push(root);if(root==key)return true;boolean figleft=getStack(root.left,stack,key);if(figleft)return true;//左边找到了节点boolean figright=getStack(root.right,stack,key);if (figright)return true;//右边找到了节点stack.pop();//该节点的左右子树都没有寻找的节点,从栈上,或者路径上移除return false;}
http://www.lryc.cn/news/284683.html

相关文章:

  • 《Linux高性能服务器编程》笔记03
  • Java毕业设计-基于ssm的网上求职招聘管理系统-第85期
  • UDP和TCP
  • 【C++】vector容器接口要点的补充
  • electron-vite中的ipc通信
  • 探秘网络爬虫的基本原理与实例应用
  • 音视频编解码学习记录
  • 零基础小白刚刚入门Python的注意点总结~
  • 从 Context 看 Go 设计模式:接口、封装和并发控制
  • 微信小程序字体大小
  • L1-062 幸运彩票(Java)
  • 【计算机网络】2、传输介质、通信方向、通信方式、交换方式、IP地址表示、子网划分
  • 【Linux 内核源码分析】堆内存管理
  • Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑
  • 模具制造企业ERP系统有哪些?企业怎么选型适配的软件
  • 管理信息系统知识点复习
  • 【Bug】.net6 cap总线+rabbitmq延时消息收不到
  • 在 Python 中检查一个数字是否是同构数
  • 【 Qt 快速上手】-①- Qt 背景介绍与发展前景
  • Kafka-消费者-KafkaConsumer分析-PartitionAssignor
  • 【办公软件篇】软件启动器Lucy打造自己的工具箱
  • C#MQTT编程08--MQTT服务器和客户端(cmd版)
  • 【高等数学之牛莱公式】
  • 基于HFSS的微带线特性阻抗仿真-与基于FDTD的计算电磁学方法对比(Matlab)
  • 【SQL】SQL语法小结
  • Open CASCADE学习|显示模型
  • 【C++】string的基本使用
  • vue 里 props 类型为 Object 时设置 default: () => {} 返回的是 undefined 而不是 {}?
  • 04 SpringMVC响应数据之页面跳转控制+返回JSON数据+返回静态资源
  • Python圣诞主题绘图:用turtle库打造冬日奇妙画面【第31篇—python:圣诞节】