【每日一练】谷歌面试题:用JAVA翻转二叉搜索树

news2024/9/28 7:25:59

文章目录

    • 前言
    • 题目
    • 分析
    • 实战演示
      • 1、创建一颗搜索二叉树
      • 2、中序遍历二叉搜索树
      • 3、根据题意创建二叉搜索树并展示
      • 4、算法增加二叉树翻转方法
      • 5、根据题意测试翻转二叉树结果
      • 6、完整代码

前言

很多同学应该都能够模拟出一个二叉树,那么又有多少同学能够写出翻转二叉树呢?有一道谷歌面试题:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
在这里插入图片描述

题目

翻转一棵二叉树
示例:
输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

分析

1、根据示例翻转二叉树就是将所有的左右节点交换即可
2、我们可以取到每一个节点,然后将左右节点交换,当然这是一个递归的操作
3、为便于我们测试,我们采用二叉搜索树演示。
4、二叉搜索树规则:左子节点必须小于父节点,右子节点必须大于父节点,所有左子节点最大值不大于当前父节点,所有右子节点最小值不小于当前父节点。

实战演示

为方便测试我们需要先创建一个构建一颗二叉树的算法,然后再编写翻转二叉树的算法

1、创建一颗搜索二叉树

为了方便演示,我们仅实现添加节点的算法

/**
 * 创建二叉搜索树
 * 定义 左节点小于父节点,右节点大于父节点
 *
 */
private void createTree(Node root,int val){
    if(Objects.isNull(root) || val == 0){
        return;
    }
    //封装节点
    Node node = new Node(val);
    //节点放入
    setNode(root,node);
}



/**
 * 设置节点
 * @param root
 * @param node
 * @author senfel
 * @date 2023/5/4 10:03
 * @return void
 */
private void setNode(Node root, Node node) {
   if(node.val > root.val){
       //右节点
       if(root.rightNode == null){
           root.rightNode = node;
       }else{
           setNode(root.rightNode,node);
       }
   }else if(node.val < root.val){
       //左节点
       if(root.leftNode == null){
           root.leftNode = node;
       }else{
           setNode(root.leftNode,node);
       }
   }else{
       //相等不做处理
       return;
   }
}

/**
 * 节点
 */
static class Node{
    /**
     * 值
     */
    int val;
    /**
     * 左节点
     */
    Node leftNode;
    /**
     * 右节点
     */
    Node rightNode;

    public Node(int val) {
        this.val = val;
    }
}

2、中序遍历二叉搜索树

为了方便展示我们采用中序遍历二叉树

/**
 * 遍历打印二叉搜索树
 * 中序打印
 * @param node
 * @author senfel
 * @date 2023/5/4 10:28
 * @return void
 */
public void toString(Node node){
    if(Objects.isNull(node)){
        return;
    }
    toString(node.leftNode);
    System.err.println("node-val:"+node.val);
    toString(node.rightNode);
}

3、根据题意创建二叉搜索树并展示

3.1 创建二叉搜索树测试用例

public static void main(String[] args) {
    Node node = new Node(4);
    ReverseTreeDemo reverTreeDemo = new ReverseTreeDemo();
    reverTreeDemo.createTree(node,2);
    reverTreeDemo.createTree(node,7);
    reverTreeDemo.createTree(node,1);
    reverTreeDemo.createTree(node,3);
    reverTreeDemo.createTree(node,6);
    reverTreeDemo.createTree(node,9);
    System.err.println(node);
    reverTreeDemo.toString(node);
}

3.2 查看测试结果

在这里插入图片描述

3.3 中序打印二叉树结果

node-val:1
node-val:2
node-val:3
node-val:4
node-val:6
node-val:7
node-val:9


     4
   /   \
  2     7
 / \   / \
1   3 6   9

4、算法增加二叉树翻转方法

/**
 * 翻转节点
 * 为了符合题意,相当于左右子树交换位置
 * @param root
 * @author senfel
 * @date 2023/5/4 10:37
 * @return void
 */
private void reverseNode(Node root){
    if(Objects.isNull(root)){
        return;
    }
    Node rightNode = root.rightNode;
    root.rightNode = root.leftNode;
    root.leftNode = rightNode;
    if(root.leftNode != null){
        reverseNode(root.leftNode);
    }
    if(root.rightNode != null){
        reverseNode(root.rightNode);
    }
}

5、根据题意测试翻转二叉树结果

5.1 创建翻转测试用例

public static void main(String[] args) {
    Node node = new Node(4);
    ReverseTreeDemo reverTreeDemo = new ReverseTreeDemo();
    reverTreeDemo.createTree(node,2);
    reverTreeDemo.createTree(node,7);
    reverTreeDemo.createTree(node,1);
    reverTreeDemo.createTree(node,3);
    reverTreeDemo.createTree(node,6);
    reverTreeDemo.createTree(node,9);
    System.err.println(node);
    reverTreeDemo.toString(node);
    //翻转树的左右节点
    reverTreeDemo.reverseNode(node);
    System.err.println(node);
    reverTreeDemo.toString(node);
}

5.2 查看翻转结果
在这里插入图片描述

5.3 中序遍历二叉树翻转结果

node-val:9
node-val:7
node-val:6
node-val:4
node-val:3
node-val:2
node-val:1


     4
   /   \
  7     2
 / \   / \
9   6 3   1

6、完整代码

/**
 * 翻转二叉树demo
 * @author senfel
 * @version 1.0
 * @date 2023/5/4 9:38
 */
public class ReverseTreeDemo {

    /**
     * 创建二叉搜索树
     * 定义 左节点小于父节点,右节点大于父节点
     *
     */
    private void createTree(Node root,int val){
        if(Objects.isNull(root) || val == 0){
            return;
        }
        //封装节点
        Node node = new Node(val);
        //节点放入
        setNode(root,node);
    }



    /**
     * 设置节点
     * @param root
     * @param node
     * @author senfel
     * @date 2023/5/4 10:03
     * @return void
     */
    private void setNode(Node root, Node node) {
       if(node.val > root.val){
           //右节点
           if(root.rightNode == null){
               root.rightNode = node;
           }else{
               setNode(root.rightNode,node);
           }
       }else if(node.val < root.val){
           //左节点
           if(root.leftNode == null){
               root.leftNode = node;
           }else{
               setNode(root.leftNode,node);
           }
       }else{
           //相等不做处理
           return;
       }
    }

    /**
     * 节点
     */
    static class Node{
        /**
         * 值
         */
        int val;
        /**
         * 左节点
         */
        Node leftNode;
        /**
         * 右节点
         */
        Node rightNode;

        public Node(int val) {
            this.val = val;
        }
    }

    /**
     * 翻转节点
     * 为了符合题意,相当于左右子树交换位置
     * @param root
     * @author senfel
     * @date 2023/5/4 10:37
     * @return void
     */
    private void reverseNode(Node root){
        if(Objects.isNull(root)){
            return;
        }
        Node rightNode = root.rightNode;
        root.rightNode = root.leftNode;
        root.leftNode = rightNode;
        if(root.leftNode != null){
            reverseNode(root.leftNode);
        }
        if(root.rightNode != null){
            reverseNode(root.rightNode);
        }
    }


    /**
     * 遍历打印二叉搜索树
     * 中序打印
     * @param node
     * @author senfel
     * @date 2023/5/4 10:28
     * @return void
     */
    public void toString(Node node){
        if(Objects.isNull(node)){
            return;
        }
        toString(node.leftNode);
        System.err.println("node-val:"+node.val);
        toString(node.rightNode);
    }


    /**
     * 测试用例
     * @param args
     */
    public static void main(String[] args) {
        Node node = new Node(4);
        ReverseTreeDemo reverTreeDemo = new ReverseTreeDemo();
        reverTreeDemo.createTree(node,2);
        reverTreeDemo.createTree(node,7);
        reverTreeDemo.createTree(node,1);
        reverTreeDemo.createTree(node,3);
        reverTreeDemo.createTree(node,6);
        reverTreeDemo.createTree(node,9);
        System.err.println(node);
        reverTreeDemo.toString(node);
        //翻转树的左右节点
        reverTreeDemo.reverseNode(node);
        System.err.println(node);
        reverTreeDemo.toString(node);
    }

}

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

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

相关文章

2d俯视视角游戏,可以切换多种枪械

文章目录 一、 介绍二、 人物移动、鼠标控制转向三、子弹脚本四、子弹随机抛壳五、 爆炸特效六、 发射子弹七、 子弹、弹壳对象池八、 散弹枪九、 火箭弹、发射火箭十、 下载工程文件 一、 介绍 2d俯视视角游戏。 人物视角跟随鼠标移动 多种枪械 抛壳效果 多种设计效果 对象池…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 &#xff08;相对路…

第三十章 Unity角色控制器 Character Controller

在我们之前的章节中&#xff0c;我们已经了解了碰撞体和刚体。但是&#xff0c;对于刚体这个组件来讲&#xff0c;有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果&#xff08;例如&#xff0c;门的开关&#xff09;&#xff1b;其二就是使用代码来控制物体移动或…

【网络进阶】HTTP服务器(一)

文章目录 1. HTTP简介2. HTTP工作原理3. HTTP注意事项4. HTTP消息结构5. 客户端请求消息6. 服务器响应消息7. GET传递数据实例8. HTTP请求方法9. HTTP响应头信息 1. HTTP简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于传…

Spring Cloud的五大组件你知道多少

前言 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。 Spring Clo…

瑞萨e2studio(25)----电容触摸配置(2)

瑞萨e2studio.24--电容触摸配置1 概述初始配置监控检测电容按键显示和测量标准差显示多个触摸按键曲线 概述 篇文档将在上篇文章基础上修改电容触摸配置。 初始配置 需要进入Debug模式才可以进行电容触摸配置。 监控检测电容按键 从电容触摸主界面&#xff08;QE&#xf…

解决Xshell安装时错误代码-1603的问题

安装流程 官网下载&#xff1a;家庭/学校免费 - NetSarang Website 填写姓名&#xff0c;邮箱&#xff0c;申请下载&#xff0c;就能在邮箱收到下载链接 点击链接即可自动开始下载&#xff1b; 下载完成后进行安装即可 问题描述 安装进行到最后一步时&#xff0c;出现下图…

CCED2000后,中文编程软件再次脱颖而出,系出金山

WPS抗衡微软&#xff0c;CCEDE却被淹没&#xff1f; DOS代&#xff0c;我们用WPS来进行文字编辑&#xff0c;CCED来做表格&#xff0c;两者在那个时代可以称得上是国产办公领域的“必装软件”。 如今&#xff0c;30年过去了&#xff0c;WPS一步一步成长为抗衡微软office的国产…

4d毫米波雷达聚类检测和追踪

待整理和写代码&#xff0c;准备先用dbcan聚类&#xff0c;用激光那一套做做看看效果 流程 4D雷达毫米波聚类跟踪流程如下图&#xff1a; 预处理主要包括标定、坐标转换和动静分离。 标定使用水平仪、角反&#xff0c;采集数据分析&#xff0c;得到水平和俯仰偏角。 坐标转…

nssctf web (3)

[HUBUCTF 2022 新生赛]checkin <?php show_source(__FILE__); #将当前文件的代码显示到页面 $username "this_is_secret"; #给username赋值 $password "this_is_not_known_to_you"; #给password赋值 include("flag.php");//here I ch…

MySQL数据管理

一、MySQL数据库管理 1、库和表 行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性 2、常用的数据类型 int &#xff1a;整型 float &#xff1a;单精度浮点 4字节32位 double &…

《网络安全审查办法》

1发展历程 2020年4月27日&#xff0c;12部门联合发布《网络安全审查办法》&#xff0c;2020年6月1日起实施。 2021年7月10日&#xff0c;国家互联网信息办公室发布关于《网络安全审查办法&#xff08;修订草案征求意见稿&#xff09;》公开征求意见的通知。11月16日国家互联网信…

【C++入门】你知道为什么C++有函数重载而C语言没有函数重载吗?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

《最强Android书 架构大剖析》读书笔记

文章目录 第一章 Android 体系结构的变革之路1.2 Android系统源码目录与Linux的异同Android的框架原生二进制可执行文件Android 的原生库核心(core)库用以支持框架的库硬件抽象层Linux内核不带上层 UI界面的Android 第二章 Android 的分区和文件系统2.1 分区架构实验:从设备中获…

ffmpeg学习日记513-源码-configure_filtergraph()函数分析及功能

Date: 12/04/2023 Hours: Details:template_tags 文章目录 源码版本实现文件函数原型参数释义函数功能函数分析filtergraph_is_simple函数 总结参考 源码版本 ffmpeg-4.1.10 实现文件 fftools/ffmpeg_filter.c 函数原型 int configure_filtergraph(FilterGraph *fg)参数释…

重识三只松鼠:“二次创业”的新变革,“深蹲起跳”的新动能

“羚羊明白它必须跑得比狮子快&#xff0c;不然它会被狮子吃掉&#xff1b;每天早晨狮子醒来&#xff0c;狮子也明白它必须赛过跑得最慢的羚羊&#xff0c;不然它会活活饿死。不论你是狮子还是羚羊&#xff0c;都不重要……重要的是每天旭日东升&#xff0c;你就得开始奔跑&…

突破经典网格特征?AutoFocusFormer: Image Segmentation off the Grid 论文阅读笔记

突破经典网格特征&#xff1f;AutoFocusFormer: Image Segmentation off the Grid 论文阅读笔记 一、Abstract二、引言三、相关工作视觉 Transformer Backbones基于聚类的注意力自适应下采样点云网络 四、方法4.1 聚类和区域4.1.1 平衡聚类4.1.2 聚类的区域 写在前面 这一周赶上…

【五一创作】Visual Studio常用调试技巧的温习

当你在编写C程序时&#xff0c;难免会遇到代码出现错误的情况。这时候就需要用调试工具来定位问题并解决它。以下是一些在Visual Studio中使用调试器时常用的技巧&#xff0c;权当作温故总结罢~ 1. 断点 断点是调试中最为基本但也最常用的技巧之一。通过在需要定位的代码行上打…

一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系

想要搞清楚 x64、IA64、AMD64 指令集之间的关系&#xff0c;就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。 x86 处理器 1978年 Intel 生产了它的第一款 16bit 处理器8086&#xff0c;之后几款处理器名字也都以86结尾&#xff0c;包括80186&#xff0c;80286&a…

五一长假暴露了电动爹的真面目,而新能源汽车市场似乎也到了转折点

4月份国内市场汽车销量数据已经出炉&#xff0c;同比来说仍然保持了很高的增长&#xff0c;不过环比数据却显示出新能源汽车市场似乎已到了转折点&#xff0c;繁荣期似乎已经结束&#xff0c;淘汰赛开始了。 一、五一长假再次暴露了电动爹的真面目 新能源汽车长途旅行首先就是怕…