想要精通算法和SQL的成长之路 - 恢复二叉搜索树和有序链表转换二叉搜索树

想要精通算法和SQL的成长之路 - 恢复二叉搜索树和有序链表转换二叉搜索树

  • 前言
  • 一. 恢复二叉搜索树
  • 二. 有序链表转换二叉搜索树

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 恢复二叉搜索树

原题链接
在这里插入图片描述

首先,一个正常地二叉搜索树在中序遍历下,遍历的元素一定是单调递增的。而题目中提醒道,正好有两个节点被互换了。那么以下面的递增序列为例:

  • [1,2,3,4,5,6,7]。
  • 被替换后:[1,2,6,4,5,3,7],它一定满足一个特性:存在两个地方,满足递减的情况。
  • 第一个问题点:6,4。这里我们需要找到第一个:下一个元素比当前元素小的,我们取当前元素。取前者。
  • 第二个问题点:5,3,在找到第一个问题点的前提下,再找:下一个元素比当前元素小的,我们取后者。
  • 最后两个问题节点值互换即可(不可以节点互换,一定是值互换)
TreeNode firstNode, secondNode, preNode = new TreeNode(Integer.MIN_VALUE);public void recoverTree(TreeNode root) {inOrderReadTree(root);int tmp = firstNode.val;firstNode.val = secondNode.val;secondNode.val = tmp;
}public void inOrderReadTree(TreeNode root) {if (root == null) {return;}// 左中右的顺序遍历inOrderReadTree(root.left);// 找到第一个开始递减的元素if (firstNode == null && preNode.val > root.val) {firstNode = preNode;// 取前者}// 找到第一个节点的前提下,找到第二个开始递减的元素if (firstNode != null && preNode.val > root.val) {secondNode = root;// 取后者}preNode = root;inOrderReadTree(root.right);
}

二. 有序链表转换二叉搜索树

原题链接

在这里插入图片描述

首先一点,题目的入参是一个链表,对于链表而言,不好操作,我们可以先把他转为数组:

// 构建成数组,入参是head
ArrayList<Integer> tmp = new ArrayList<>();
while (head != null) {tmp.add(head.val);head = head.next;
}
int[] arr = new int[tmp.size()];
for (int i = 0; i < arr.length; i++) {arr[i]= tmp.get(i);
}

其次,既然要高度平衡,那么这个题目而言,我们必定是针对转化后的数组,不断地以中间节点为根节点,向左右两侧构建树。

那么就是一个很简单的分治递归法:

public TreeNode buildTree(int left, int right, int[] arr) {if (left > right) {return null;}// 中间节点下标int mid = (left + right) >> 1;TreeNode root = new TreeNode(arr[mid]);root.left = buildTree(left, mid - 1, arr);root.right = buildTree(mid + 1, right, arr);return root;
}

完整代码如下:

public TreeNode sortedListToBST(ListNode head) {// 构建成数组ArrayList<Integer> tmp = new ArrayList<>();while (head != null) {tmp.add(head.val);head = head.next;}int[] arr = new int[tmp.size()];for (int i = 0; i < arr.length; i++) {arr[i] = tmp.get(i);}TreeNode treeNode = buildTree(0, arr.length - 1, arr);return treeNode;
}public TreeNode buildTree(int left, int right, int[] arr) {if (left > right) {return null;}// 中间节点下标int mid = (left + right) >> 1;TreeNode root = new TreeNode(arr[mid]);root.left = buildTree(left, mid - 1, arr);root.right = buildTree(mid + 1, right, arr);return root;
}

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

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

相关文章

MacBook 录制电脑内部声音

MacBook 录制电脑内部声音 老妈喜欢跳广场舞&#xff0c;现在广场舞音频下载都收费了&#xff01;没办法&#xff0c;只能自己录歌了&#xff0c;外录有杂音大家也都知道&#xff0c;所以就只能采用内录的方式然后再用 Audition 调整一下音量大小。 一、&#xff08;前置条件&a…

点餐小程序实战教程03-用户注册

我们上一篇介绍了如何创建用户数据源&#xff0c;有了数据源之后就需要思考如何判断用户是否注册过。根据用户在系统中的状态来判断是引导到注册页面还是直接显示首页。 1 前端API 判断用户是否注册&#xff0c;需要拿到用户登录状态的信息。我们在上一篇已经分析了微搭支持的…

1300*D. Alice, Bob and Candies(模拟)

Problem - 1352D - Codeforces 解析&#xff1a; 模拟即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&t);while(t--){scanf("%lld",&n);for(int i…

2023年中国智能电视柜产量、需求量、市场规模及行业价格走势[图]

电视柜是随着电视机的发展和普及而演变出的家具种类&#xff0c;其主要作用是承载电视机&#xff0c;又称视听柜&#xff0c;随着生活水平的提高&#xff0c;与电视机相配套的电器设备也成为电视柜的收纳对象。 随着智能家具的发展&#xff0c;智能电视机柜的造型和风格都是有了…

Spring Boot中的@Controller使用教程

一 Controller使用方法&#xff0c;如下所示&#xff1a; Controller是SpringBoot里最基本的组件&#xff0c;他的作用是把用户提交来的请求通过对URL的匹配&#xff0c;分配个不同的接收器&#xff0c;再进行处理&#xff0c;然后向用户返回结果。下面通过本文给大家介绍Spr…

【数据库——MySQL】(14)过程式对象程序设计——游标、触发器

目录 1. 游标1.1 声明游标1.2 打开游标1.3 读取游标1.4 关闭游标1.5 游标示例 2. 触发器2.1 创建触发器2.2 修改触发器2.3 删除触发器2.4 触发器类型2.5 触发器示例 参考书籍 1. 游标 游标一般和存储过程一起配合使用。 1.1 声明游标 要使用游标&#xff0c;需要用到 DECLAR…

Docker基本管理

虚拟化产品&#xff1a; 1.寄居架构 2.原生架构 Docker 基本管理 docker 发展历史 https://www.cnblogs.com/rongba/articles/14782624.html -----------------Docker 概述--------------------------- Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了a…

英伟达NVIDIA驱动安装

一般&#xff0c;我们新的显卡上机或者新系统可能就需要重新安装显卡驱动。或者是我们在配置深度学习环境时候&#xff0c;需要手动安装驱动。 官网地址&#xff1a;官方高级驱动搜索 | NVIDIA 我们选择好自己需要的驱动后直接安装即可 下载的时候&#xff0c;选择自己需要的驱…

SSRF+redis未授权漏洞复现

1.SSRF漏洞简介 SSRF&#xff08;Server-Side Request Forgery&#xff09;即服务器端请求伪造&#xff0c;是一种由攻击者构造攻击链传给服务器&#xff0c;服务器执行并发起请求造成安全问题的漏洞&#xff0c;一般用来在外网探测或攻击内网服务。当网站需要调用指定URL地址…

Linux基本指令介绍系列第四篇

文章目录 前言一、Linux基本指令介绍1、more指令2、less指令3、head指令4、tail指令5、bc指令6、管道文件介绍7、与时间相关的指令 总结 前言 本文介绍Linux使用时的部分指令&#xff0c;读者如果想了解更多基本指令的使用&#xff0c;可以关注博主的后续的文章。 博主使用的实…

Shiro应用到Web Application

一、权限基础 a) 认证(你是谁&#xff1f;) 判断你(被认证者)是谁的过程。通常被认证者提供用户名和密码。 常见的认证包含如下几种&#xff1a; 匿名认证&#xff1a;允许访问资源&#xff0c;不做任何类型的安全检查。表单认证&#xff1a;访问资源之前&#xff0c;需要提…

【Linux】进程探秘

文章目录 一、什么是进程&#xff1f;1.1写一个进程 二、操作系统是如何管理的进程的呢&#xff1f;2.1描述进程-PCB2.2组织进程 三、Linux下是怎么做的&#xff1f;3.1task_struct-PCB的一种3.2task_ struct内容分类3.3linux中组织进程3.4查看进程的相关属性 &#x1f340;小结…