面试算法52:展平二叉搜索树

news2025/1/18 8:59:02

题目

给定一棵二叉搜索树,请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表,但仍然是二叉搜索树。
在这里插入图片描述

分析

看起来需要按照节点的值递增的顺序遍历二叉搜索树中的每个节点,并将节点用指向右子节点的指针连接起来。这就容易让人联想到二叉树的中序遍历,只是在这里每遍历到一个节点要把前一个节点的指向右子节点的指针指向它。

public class Test {
    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);

        node4.left = node2;
        node4.right = node5;
        node2.left = node1;
        node2.right = node3;
        node5.right = node6;

        TreeNode result = increasingBST(node4);
        System.out.println(result);
    }

    public static TreeNode increasingBST(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        TreeNode prev = null;
        TreeNode first = null;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.pop();
            if (prev != null) {
                prev.right = cur;
            }
            else {
                first = cur;
            }

            prev = cur;
            cur.left = null;
            cur = cur.right;
        }
        return first;
    }
}

中序遍历的迭代算法:

public class Test {
    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);

        node4.left = node2;
        node4.right = node5;
        node2.left = node1;
        node2.right = node3;
        node5.right = node6;

        List<Integer> result = inorderTraversal(node4);
        System.out.println(result);
    }

    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> nodes = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.pop();
            nodes.add(cur.val);
            cur = cur.right;
        }

        return nodes;
    }
}

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

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

相关文章

观测云产品更新 | 单点登录新增 OIDC / Oauth2.0 协议、数据转发优化、场景优化等

观测云更新 数据转发 1. 新增【观测云】选项&#xff0c;支持将数据保存到观测云的对象存储&#xff0c;计费逻辑按天出账&#xff0c;每天统计存储的压缩后的数据大小&#xff0c;按照每 GB 0.007 元出具对应账单。 2. 数据转发菜单导航位置调整至【管理】模块&#xff0c;…

ActiveMQ是什么?-九五小庞

MQ是消息中间件&#xff0c;是一种在分布式系统中应用程序借以传递消息的媒介&#xff0c;常用的有ActiveMQ&#xff0c;RabbitMQ&#xff0c;kafka。ActiveMQ是Apache下的开源项目&#xff0c;完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点&#xff1a;1、支持多种语言…

黑色星期五来袭,Ozon为你提供丰富的推广工具和资源,助你实现销售突破!

Ozon的“黑色星期五”促销活动为卖家们提供了丰富的推广工具和资源&#xff0c;以确保他们的商品在促销期间获得最大的曝光度和销售额。卖家们应该充分利用这些机会&#xff0c;制定合适的折扣策略&#xff0c;并确保他们的商品在Ozon平台上脱颖而出。 为了推广Ozon黑色星期五促…

AI、万圣节与聊斋;用AI写甜蜜恋爱小暖文;AGI新趋势与机会洞察;Meta官方Llama 2入门指南 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 时代杂志评选2023年度最佳发明&#xff0c;AI赛道入选名单 https://time.com/collection/best-inventions-2023 10 月 24 日&#xff…

java那些数据类型是安全加锁的。

我还没有反应过来&#xff0c;首先考虑的是基本数据类型&#xff0c;因为底层这块儿是在没有看过&#xff0c;Spring是被final修饰不可变的。后来才明白&#xff0c;原来是问你线程安全问题。 锁数据类型。 其实就是被synchronized修饰过的数据类型。 例如StringBuffer 底层 …

国外住宅IP代理测评选择的8个方法,稳定的海外IP哪个靠谱?

一、国外住宅IP代理是什么&#xff1f; 代理服务器充当您和互联网之间的网关。它是一个中间服务器&#xff0c;将最终用户与他们浏览的网站分开。如果您使用国外代理IP&#xff0c;互联网流量将通过国外代理服务器流向您请求的地址。然后&#xff0c;请求通过同一个代理服务器…

C++类和对象下(初始化列表,静态成员,explicit关键字,友元)

C类和对象下[初始化列表,静态成员,explicit关键字,友元] 一.初始化列表1.为什么会有初始化列表2.初始化列表的语法形式3.没有默认构造函数的自定义成员变量4.初始化列表是成员变量定义的地方5.初始化列表可以跟函数体内定义搭配使用6.初始化列表执行的顺序7.总结建议 二.静态成…

KT6368A蓝牙芯片发送指令设置中文蓝牙名是乱码 这个要如何处理

目录 一、KT6368A蓝牙芯片为什么发送at指令设置中文spp蓝牙名&#xff0c;是乱码 这个要如何处理 第一步&#xff0c;在pc端新建一个txt文档&#xff0c;将您需要的名字&#xff0c;汉字打出来&#xff0c;另存为UTF-8编码 第二步&#xff0c;使用winhex软件&#xff0c;当然…

JVS智能BI(自助式商业分析)本周更新内容已上线

在数据分析与可视化的世界中&#xff0c;我们始终在寻找新的创新与突破&#xff0c;以帮助用户更高效、更直观地理解数据&#xff0c;洞察业务的深层逻辑。本周更新包含了一系列的新功能、优化及bug修复&#xff0c;更新如下&#xff1a; 新增: 1.新增图表分类功能&#xff1…

宝宝洗衣机哪个牌子质量好?小型洗衣机质量排名

说起洗衣服&#xff0c;大部分的家庭都会备有一台洗衣机&#xff0c;不过如果有婴儿的话&#xff0c;贴心的宝妈宝爸也会特意将宝宝的衣服与大人的衣服分开来进行清洗。很多妈妈都会自己动手洗。由于婴儿的皮肤比较娇嫩、敏感&#xff0c;所以儿童的衣物与成人的衣物混合使用&a…

视频特效制作软件:After Effects 2024 mac中文版新增功能

After Effects 2024 mac是一款专业的视频特效和动态图形设计软件&#xff0c;它可以帮助用户创建各种令人惊叹的视觉效果&#xff0c;例如粒子系统、合成特效、绿屏抠像等。该软件支持动画制作&#xff0c;包括关键帧动画、形状动画、运动跟踪等工具&#xff0c;可以创建复杂的…

数据库实验报告(五)

1、实验目的 &#xff08;1&#xff09; 掌握对聚集函数的使用 &#xff08;2&#xff09; 掌握对分组的使用 &#xff08;3&#xff09; 掌握非关联子查询的用法&#xff0c;了解相关的连接谓词 2、实验预习与准备 &#xff08;1&#xff09; 了解Max&#x…

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p&#xff0c;请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如&#xff0c;在图8.9的二叉搜索树中&#xff0c;节点8的下一个节点是节点9&#xff0c;节点11的下一个节点是null。 分析&#xf…

Web开发介绍详细介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

常见接口测试面试题

1、按你的理解&#xff0c;软件接口是什么&#xff1f; 答&#xff1a; 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别&#xff1f; 答&#xff1a; https协议需要到CA&#xff08;Certificate Authority&#xff0c;证书…

犀牛8 for Mac – 强大的三维建模软件,轻松实现创意设计

你是否正在寻找一款功能强大、易于使用的三维建模软件&#xff1f;犀牛8 for Mac是你的不二选择&#xff01;作为最新版本的犀牛系列软件&#xff0c;它汇集了众多令人惊叹的特性&#xff0c;让你能够轻松实现自己的创意设计。 犀牛8 for Mac拥有丰富而强大的三维建模工具&…

【Python基础】变量基本使用

变量 1.变量定义02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3转义字符 3.变量输入输出3.1变量格式化输出 4.变量命名 1.变量定义 变量定义 • 在 Python 中&#xff0c;每个变量 在使用前都必须赋值 在使用前都必须赋值&#xff0c;变量 赋值以后 该变量…

R语言使用HTTP爬虫IP写一个程序

R语言爬虫是指使用R语言编写程序&#xff0c;自动从互联网上获取数据的过程。在R语言中&#xff0c;可以使用三个主要的包&#xff08;XML、RCurl、rvest&#xff09;来实现爬虫功能。了解HTML等网页语言对于编写爬虫程序也非常重要&#xff0c;因为这些语言是从网页中提取数据…

解决方案中排版的灵魂的---样式的设置

word样式是一系列字符格式和段落格式的集合&#xff0c;可以在编排重复格式的时候套用样式&#xff0c;减少重复化的操作。 一、word样式 二、样式基准 样式基准是最基本或原始的文字段落格式&#xff0c;文档中的其他样式以此为基础创建。 我新建样式&#xff0c;如果选择样…

Go的Defer简介

什么是延期&#xff1f; Defer 语句用于在存在 defer 语句的周围函数返回之前执行函数调用。该定义可能看起来很复杂&#xff0c;但通过示例就很容易理解。 例子 package mainimport ( "fmt" )func finished() { fmt.Println("Finished finding largest&qu…