二叉树oj题(2)

1.二叉树的最近公共祖先

解题思路:
方法一:

1.先判断p或者q 是不是 root当中的一个

2.左子树当中递归査找p或者q

3.右子树当中递归查找p或者q

如何查找:
root 的 left 和 right 都不为空 ->root

root的 left 为空 right 不为空->right这一侧找到的就是公共祖先

root的 left 不为空 right 为空->left这一侧找到的就是公共祖先

     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null){return root;}//p或q是root当中的一个if (root==p || root==q){return root;}TreeNode left=lowestCommonAncestor(root.left,p,q);TreeNode right=lowestCommonAncestor(root.right,p,q);if(left!=null && right!=null){//p和q在root的两侧return root;}else if(right!=null){//右树不为空,但左树为空return right;}else//左树不为空,但右树为空return left;}}

 方法二:

1.得到 root到p 以及 root到q 的路径

2.得到这两条路径之后分别把它们放进两个栈中,然后开始出栈。

3.如何出栈:如果两个栈中的结点数不一样,要先把两个栈中的结点数量变得一样,即size1==size2,再开始两个栈一起出(先看当前栈顶元素是否一样,如果不一样,两个栈一起出;如果一样,随便出一个栈当前的栈顶元素(s1.pop() 或 s2.pop() ),这个出的元素就是公共祖先)。

如何得到路径:

1.只要root不为空 就放在栈中

2.再判断当前节点 左子树 右子树 是不是有要找的节点。如果都没有就出栈。

3. root == node 找到了 

 public boolean getPath(TreeNode root, TreeNode node,Stack<TreeNode> stack) {if(root == null) {return false;}stack.push(root);if(root == node) {return true;}boolean flgLeft = getPath(root.left,node,stack);if(flgLeft) {return true;}boolean flgRight = getPath(root.right,node,stack);if(flgRight) {return true;}stack.pop();return false;}public TreeNode lowestCommonAncestor2(TreeNode root,TreeNode p, TreeNode q) {if(root == null) {return null;}Stack<TreeNode> stack1 = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();getPath(root,p,stack1);getPath(root,q,stack2);int size1 = stack1.size();int size2 = stack2.size();if (size1 > size2) {int size = size1-size2;while (size != 0) {stack1.pop();size--;}}else {int size = size2-size1;while (size != 0) {stack2.pop();size--;}}while (!stack1.isEmpty() && !stack2.isEmpty()) {if(stack1.peek().equals(stack2.peek())) {return stack1.pop();//return stack2.pop();}else {stack1.pop();stack2.pop();}}return null;}

2.二叉树创建字符串

class Solution {public String tree2str(TreeNode root) {StringBuilder sbu = new StringBuilder();tree2strChild(root,sbu);return sbu.toString();}public void tree2strChild(TreeNode root,StringBuilder sbu) {if(root == null) {return;}sbu.append(root.val);//1、先递归左树if(root.left != null) {sbu.append("(");tree2strChild(root.left,sbu);sbu.append(")");}else {if(root.right == null) {return;}else {sbu.append("()");}}//2、递归右树if(root.right != null) {sbu.append("(");tree2strChild(root.right,sbu);sbu.append(")");}else {return;}}
}

 3.二叉树的前序遍历

class Solution {List<Integer> list=new ArrayList<>();if(root==null){return list;}Stack<TreeNode> stack=new Stack<>();TreeNode cur=root;while(cur!=null || !stack.isEmpty()){while(cur!=null){stack.push(cur);list.add(cur.val);cur=cur.left;}TreeNode top=stack.pop();cur=top.right;}return list;}
}

4.二叉树的中序遍历

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<>();if(root==null){return list;}Stack<TreeNode> stack=new Stack<>();TreeNode cur=root;while(cur!=null || !stack.isEmpty()){while(cur!=null){stack.push(cur);cur=cur.left;}TreeNode top=stack.pop();list.add(top.val);cur=top.right;}return list;}
}

5.二叉树的后序遍历

   public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if(root == null) {return list;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode prev = null;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if(top.right == null || top.right == prev ) {stack.pop();list.add(top.val);prev = top;}else {cur = top.right;}}return list;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979796.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

话题——为什么要学习程序,成为程序员呢?

选择成为一名程序员&#xff0c;这对我而言并非是一时冲动&#xff0c;而是深思熟虑后的坚定选择。在当下这个信息化、数字化的时代&#xff0c;程序员这一职业不仅具有极高的技术含量&#xff0c;更承载了推动社会进步、引领科技发展的重任。特别是在深度学习这一前沿领域&…

复写零 ---- 双指针

题目链接 题目: 分析: 就地对数组进行操作, 肯定是需要双指针的 那么我们从左往右进行复写, 定义一个cur用来遍历数组, 一个dest用来修改数组的值, 如果cur下标的值不为零, 那么将cur的值写到dest位置, cur, dest; 如果cur下标的值为0, 那么就将dest下标的值写为0, dest, 再将…

Linux系统编程——进程

一、进程相关概念 面试中关于进程&#xff0c;应该会问的的几个问题&#xff1a; 1.1 什么是程序&#xff1f;什么是进程&#xff1f;有什么区别&#xff1f; 程序是静态的概念&#xff0c;比如&#xff1a; 磁盘中生成的a.out文件&#xff0c;就叫做&#xff1a;程序 进程…

11408知识点集合

文章目录 一、数学(一) 高数0.初等数学补充1.函数、极限、连续2.导数3.中值定理4.积分5.微分方程6.空间解析几何7.多元微分8.重积分9.曲线曲面积分10.无穷级数11.其他杂记(二) 线代0.串联各章的等价条件1.行列式、矩阵的秩、矩阵的初等变换2.向量3.方程组、矩阵方程AXB4.特征值…

Springboot+Vue项目-基于Java+MySQL的学科竞赛管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具&#xff0c;与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0&#xff0c;所以kibana选择同样的7.12.0版本。 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releas…

WEB攻防-ASP中间件IIS 短文件名探针安全漏洞

IIS短文件名探针安全漏洞是一个与IIS&#xff08;Internet Information Services&#xff09;服务相关的安全问题。该漏洞主要是由于HTTP请求中使用了旧DOS 8.3名称约定&#xff08;SFN&#xff09;的代字符&#xff08;〜&#xff09;波浪号&#xff0c;这使得远程攻击者有可能…

Xilinx FPGA BGA推荐设计规则和策略(二)

引言&#xff1a;上一篇介绍了BGA封装PCB层数估计、BGA焊盘设计、过孔设计、信号走线等内容&#xff0c;本文我们介绍下FPGA BGA封装电源管脚布线。 1. 概述 工程师必须在设计阶段早期评估功率需求&#xff0c;以确保有足够的层和面积为需要功率的BGA焊盘提供足够的功率。因为…

深入探索GDB:Linux下强大的调试神器

目录 一、GDB简介&#xff1a;源码级调试的基石 二、GDB基础操作&#xff1a;从入门到熟练 启动与基本命令 三、GDB进阶功能&#xff1a;解锁更深层次的调试能力 1. 回溯追踪&#xff1a;洞察调用栈 2. 动态内存检测&#xff1a;揪出内存问题 3. 条件断点与观察点&#…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

从0到1实现RPC | 接入Apollo配置中心

一、代码实现 添加依赖 添加apollo客户端的依赖和spring配置相关依赖 添加监听器 通过实现ApplicationContextAware接口&#xff0c;获取Spring上下文。 使用ApolloConfigChangeListener注解监听命名空间rpc-demo-provider.yaml和默认的application.properties。 监听逻辑…

Bentley二次开发教程21-文件及模型管理-分组(NamedGroup)介绍

当我们需要对模型中的元素分组时&#xff0c;就需要使用NamedGroup功能&#xff0c;不同于单元&#xff0c;他们的元素并没有那么强的组合关系&#xff0c;同时&#xff0c;组与组之间可以实现嵌套&#xff0c;体现元素间的层级关系。 创建NamedGroup NamedGroup的创建流程为…

JAVA之Spring入门导读

目录 一.Spring是什么&#xff1f; 1.1Spring的简介 1.2 个人看法 2 Spring的深层次了解 2.1Spring的结构层次 2.1Spring的优点 学习路径&#xff1a; Spring技术链接地址Spring项目的创建和简单使用http://t.csdnimg.cn/u01URIOC&#xff08;Inversion of Control&…

Linux中文件描述符与重定向的深入探索

目录 1. 理解C语言的文件操作函数 2. 操作系统的文件操作接口 3. 文件描述符详解和其内核本质 4. 如何理解Linux下一切皆文件 5. Linux中的重定向 5.1 输出重定向 5.2 追加重定向 5.3 输入重定向 6. 结合文件描述符理解重定向 7.重定向的系统调用 在Linux操作系统中&a…

学习配置文件

1.yml的语法格式问题&#xff1a; 2.配置文件获取数据&#xff1a; Value方式&#xff1a; Environment&#xff1a; 获取自定义对象的方式&#xff1a; 设置get和set方法&#xff0c;还有toString方法。 3. 日志配置&#xff1a; logo的配置&#xff1a; 日志插件&#xff…

Android Studio开发之路(八)Spinner样式设置

一、需求 白色背景显示下拉框按钮 问题&#xff1a; 设置Spinner的背景可以通过设置background&#xff1a; android:background"color/white",但是一旦设置了这个值&#xff0c;右侧的下拉按钮就会消失 方法一、自定义一个style&#xff08;不成功&#xff09; …

Java 【数据结构】 二叉树(Binary_Tree)【神装】

登神长阶 第五神装 二叉树 Binary-Tree 目录 &#x1f3b7;一.树形结构 &#x1fa97;1.概念 &#x1f3b8;2.具体应用 &#x1f3b9; 二.二叉树&#xff08;Binary Tree&#xff09; &#x1f3ba;1.概念 &#x1f3bb;2.表现形式 &#x1fa95;3.特殊类型 &#x1f941…

【Camera Sensor Driver笔记】五、点亮指南之Actuator配置

<slaveInfo> actuatorName dw9714v dirver IC 型号 slaveAddress 0x18 i2c write address i2cFrequencyMode FAST i2c 操作频率(400KHz) actuatorType VCM/BIVCM 马达类型 BIVCM&#xff08;中置马达&#xff…

密码学 | Random Oracle 随机预言机

​ &#x1f951;原文&#xff1a;究竟什么才是随机预言机呢&#xff1f; - 玄星的回答 &#x1f951;答主指出&#xff1a; 英文维基明明对 随机预言机 给出了两个完全不同的理解&#xff0c;但这两个理解之间的连接词却是 “Stated differently”&#xff0c;即 “换句话说…

【Axure教程0基础入门】05动态面板

05动态面板 1.动态面板是什么&#xff1f; 一个用来存放多个元件的容器&#xff08;container&#xff09; 其中包含多个状态&#xff08;state&#xff09;&#xff0c;但同时只能显示一个 状态之间&#xff0c;可以通过交互动作&#xff08;action&#xff09;控制切换和动…