二叉树OJ练习(二)

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

题目描述:

题解:

 1.p或者q其中一个等于root,那么root就是最进公共祖先

 2.p和q分布在root的左右两侧,那么root就是最进公共祖先

 3.p和q在root的同一侧,就是要遍历这棵树,遇到p或者q返回

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) {return null;}//1.p或q在root的位置if (p == root || q == root) {return root;}TreeNode leftTree = lowestCommonAncestor(root.left, p, q);TreeNode rightTree = lowestCommonAncestor(root.right, p, q);//2.左边和右边都不空if (leftTree != null && rightTree != null) {return root;} else if (leftTree != null) {return leftTree;   //3.左边不为空} else {return rightTree; //4。右边不为空}}

第二种解法:

以链表思路求节解:就相当于求链表的交点

​ 

问题的关键就是如何存储,从根节点到p或者q的路径上的所有节点

//部分代码
//存储从根节点到p或者q路径上的所有节点private boolean getPath(TreeNode root, TreeNode node, Stack<TreeNode> stack) {if (root == null) {return false;}stack.push(root);if (root == node) {return true;}boolean fag1 = getPath(root.left, node, stack);if (fag1) {return true;}boolean fag2 = getPath(root.right, node, stack);if (fag2) {return true;}stack.pop();return false;}

2. 从前序与中序遍历序列构造二叉树

 题目描述: 

题解: 

前序遍历(根 左 右)

大方向:遍历前序遍历数组,在中序遍历数组找到相对应的下标,左边是左树,右边是右树

2.找递归结束条件

下次下标ib肯定是大于ie的,所以,只要ib>ie,就结束了

    public int preindex;public TreeNode buildTree(int[] preorder, int[] inorder) {return buildTreeChilde(preorder,inorder,0,inorder.length-1);}private TreeNode buildTreeChilde(int[] preorder,int[] inorder,int inBegin,int inEnd) {if(inBegin > inEnd) {return null; //没有左树 或者 右树 }TreeNode root = new TreeNode(preorder[preindex]);int rootIndex = findRootIndex(inorder,inBegin,inEnd,preorder[preindex]);if(rootIndex == -1) {return null;}preindex++;root.left = buildTreeChilde(preorder,inorder,inBegin,rootIndex-1);root.right = buildTreeChilde(preorder,inorder,rootIndex+1,inEnd);return root;}private int findRootIndex(int[] inorder,int inBegin,int inEnd,int key) {for(int i = inBegin;  i <= inEnd; i++) {if(inorder[i] == key) {return i;} }return -1;}

 3.从中序与后序遍历序列构造二叉树

题目描述:

题解: 

后序遍历(左 右 根)

1.遍历后序遍历,先创建的是右子树

2.遍历后序遍历下标是--

其它跟上题一致,稍微修改下代码

4.根据二叉树创建字符串

题目描述: 

题解:

不怕大家笑话,开始的时候,读了题也没搞懂要做什么,一脸懵。也是看这示例明白的。

看这示例一:

1.根节点直接写

2.左边不为空&&右边为空

3.左边为空&&右边为空,什么都不做

示例二:

1.左边为空&&右边不为空,加一对括号

左边不为空与右边不为空,就是分别递归了!

    private void tree2strChlide(TreeNode r, StringBuilder stringbuilder) {if (r == null) {return;}stringbuilder.append(r.val);if (r.left != null) {stringbuilder.append("(");tree2strChlide(r.left, stringbuilder);stringbuilder.append(")");} else {if (r.right == null) {return;} else {stringbuilder.append("()");}}//判断右树if (r.right != null) {stringbuilder.append("(");tree2strChlide(r.right, stringbuilder);stringbuilder.append(")");} else {return;}}

5. 二叉树前序非递归遍历实现

题目描述:

题解:

非递归打印,最好还是引入栈来解决。

1.让cur指向root

2. 把cur放到栈中   打印   cur在指向左树

3.当cur == null  弹出栈顶元素并用top记录  让cur指向top的右树

      关键是循环条件!

 

    public List<Integer> preorderTraversal(TreeNode root) {  List<Integer> ret = new ArrayList<>();if (root == null) {return ret;}TreeNode cur = root;Stack<TreeNode> stack = new Stack<>();while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);//System.out.print(cur.val + " ");ret.add(cur.val);cur = cur.left;}TreeNode top = stack.pop();cur = top.right;}return ret;}
 5.1二叉树中序非递归遍历实现

题解:

5.2 二叉树后序非递归遍历实现

题解:

后序遍历(左  右  根)

首先,会有两种情况 cur != null或者 cur == null 

1.cur != null,一直往左走

2.cur == null ,就不能在用pop(),要用peek(),判断右子树是否为null。

此时,会形成一个死循环!所以,打印这个top的时候,有两种情况。

1.右边 == null

2. 右边已经被打印完了(要记录一下)

    public void posOrderNor(TreeNode root){if(root == null) {return;}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) {System.out.print(top.val+" ");stack.pop();prev = top;} else {cur = top.right;}}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款好的葡萄酒关键在哪里?

除了易于种植&#xff0c;赤霞珠还因其独特的口感、难以置信的味道和质量而闻名。这种葡萄主要用于中高端干红葡萄酒&#xff0c;通常表现出成熟的黑色水果味道&#xff0c;带有辛辣和泥土气息。 在橡木桶中陈酿后&#xff0c;赤霞珠表现极佳。随着葡萄酒的陈年&#xff0c;橡木…

【金猿人物展】数元灵科技CEO朱亚东:何以数智化

‍ 朱亚东 本文由数元灵科技CEO朱亚东撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 在大数据经济的高速发展下&#xff0c;数据已经成为第5生产要素。打造以数据驱动为中心的标准化…

腾讯云免费服务器申请1个月攻略,亲测可行教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

NUXT3学习笔记

1.邂逅SPA、SSR 1.1 单页面应用程序 单页应用程序 (SPA) 全称是&#xff1a;Single-page application&#xff0c;SPA应用是在客户端呈现的&#xff08;术语称&#xff1a;CSR&#xff08;Client Side Render&#xff09;&#xff09; SPA的优点 只需加载一次 SPA应用程序只需…

(二)Explain使用与详解

explain中的列 sql语句: EXPLAIN SELECT * from user WHERE userId=1340; 执行结果: 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行…

Chrome您的连接不是私密连接或专用连接

方法一&#xff1a; 在当前页面用键盘输入 thisisunsafe &#xff0c;不是在地址栏输入&#xff0c;就直接敲键盘就行了因为Chrome不信任这些自签名ssl证书&#xff0c;为了安全起见&#xff0c;直接禁止访问了&#xff0c;thisisunsafe 这个命令&#xff0c;说明你已经了解并…

富文本编辑器

富文本&#xff1a;带样式&#xff0c;多格式的文本&#xff0c;在前端一般使用标签配合内联样式实现 富文本编辑器&#xff08;Rich Text Editor&#xff0c;简称 RTE&#xff09;是一种用户可以使用来创建格式化的文本内容的界面组件。它通常可以嵌入到网页或应用程序中&…

Stm32cube keil5配置串口printf 蓝牙打印不出来

1.检查cube里面波特率是否与AT蓝牙设置一致 2.keil里面设置是否打开Use MicroLIB 3、stm32cube是否开启串口中断 4.检测线路是否接触不良&#xff0c;读写线插反等。

IO流-文件复制

IO流 概述&#xff1a;IO流&#xff0c;输入输出流&#xff08;Input Output&#xff09;流&#xff1a;一种抽象的概念&#xff0c;对数据传输的总称。&#xff08;数据在设备之间的传输称为流&#xff09;常见的功能 文件复制文件上传文件下载 学习流&#xff0c;我们要搞懂…

拓数派加入 OpenCloudOS 操作系统开源社区,作为成员单位参与社区共建

近日&#xff0c;拓数派签署 CLA(Contributor License Agreement 贡献者许可协议)&#xff0c;正式加入 OpenCloudOS 操作系统开源社区。 拓数派&#xff08;英文名称“OpenPie”&#xff09;是国内基础数据计算领域的高科技创新企业。作为国内云上数据库和数据计算领域的引领者…

云渲染适合什么场景下使用?

云渲染作为影视动画主流的渲染方案&#xff0c;通常云渲染服务商拥有专属的渲染农场&#xff0c;通过渲染农场庞大的高新能数量机器&#xff0c;可协助你在短时间内完成渲染任务。 云渲染使用场景有哪些&#xff1f; 1、硬件限制&#xff1a; 如果你的个人或公司电脑硬件不足…

大模型第三节课程笔记

大模型开发范式 优点&#xff1a;具有强大语言理解&#xff0c;指令跟随&#xff0c;和语言生成的能力&#xff0c;具有强大的知识储备和一定的逻辑推理能力&#xff0c;进而能作为基座模型&#xff0c;支持多元应用。 不足&#xff1a;大模型的知识时效性受限&#xff0c;大模…

【系统高级-环境变量】path配置一整行,而不是列表

这是列表编辑方便。但是不知道为什么变成一行&#xff0c;非常的令人抓狂&#xff0c;经过研究发现&#xff0c;第一个环境变量必须为C:\Windows\system32 开头才可以 文章如下 修改环境变量中的一行变成列表形式_环境变量编辑不是列表-CSDN博客

DDIM学习笔记

写在前面&#xff1a; &#xff08;1&#xff09;建议看这篇论文之前&#xff0c;可先看我写的前一篇论文&#xff1a; DDPM推导笔记-大白话推导 主要学习和参考了以下文章&#xff1a; &#xff08;1&#xff09;一文带你看懂DDPM和DDIM &#xff08;2&#xff09;关于 DDIM …

音频文件元数据:批量修改技巧,视频剪辑高效修改元数据的方法

随着数字媒体技术的快速发展&#xff0c;音频文件已成为日常生活中的重要组成部分。无论是音乐、语音还是其他音频内容&#xff0c;元数据都是描述这些文件的重要信息。下面来看下云炫AI智剪如何批量修改音频文件元数据&#xff0c;在视频剪辑中高效修改元数据的方法。 下面来看…

Java常用类---包装类

包装类 包装类简介 Java语言是典型的面向对象编程语言&#xff0c;但是其中的8种基本数据类型并不支持面向对象编程&#xff0c;基本类型数据不具备"对象"的特性&#xff0c;即&#xff1a;没有携带属性以及没有方法可以调用。 为了解决上述问题&#xff0c;java为…

strtok函数的介绍

_str指被分解的字符串 delim指分隔符字符串 返回类型是指针 strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串&#xff0c;参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符…

【论文阅读笔记】Dichotomous Image Segmentation with Frequency Priors

1. 论文介绍 Dichotomous Image Segmentation with Frequency Priors 基于频率先验的二分图像分割 2023年发表在IJCAI Paper Code 2. 摘要 二分图像分割&#xff08;DIS&#xff09;具有广泛的实际应用&#xff0c;近年来得到了越来越多的研究关注。本文提出了解决DIS与信息…

vue项目 Network: unavailable的解决办法

vue项目npm run serve 后&#xff0c;只有localhost访问&#xff0c;network不能访。 看到网上说有三种情况&#xff1a; 多个网卡原因&#xff1a;打开网络共享中心&#xff0c;把多余的网络禁用掉&#xff0c;只留一个 在中配置host及public 系统环境变量问题…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…