翻转二叉树

声明

该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油!

原题链接

翻转二叉树备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/invert-binary-tree/

算法分析

        如下图1和图2可按照(1)、(2)、(3)、(4)的顺序依次对每个非叶子节点的左右孩子节点进行镜像反转,对于只有一个孩子节点的节点也要进行镜像反转操作。

图1

图2

        分析:

        1.如何完成镜像反转?

        可以通过递归遍历整棵树,遍历过程中按照以下方式进行判断和操作:

        (1)若当前节点为空或无左孩子和右孩子节点则return;

        (2)否则继续遍历左右孩子节点;

        (3)交换左右孩子节点;

        2.如何交换左右孩子节点?

        (1)左右孩子节点均不为空,则交换左右孩子节点;

        (2)左孩子节点为空&&右孩子节点不为空,则左孩子节点=右孩子节点,右孩子节点置空;

        (3)右孩子节点为空&&左孩子节点不为空,则右孩子节点=左孩子节点,左孩子节点置空.

代码示例(C#)
//翻转二叉树
public TreeNode MirrorTree(TreeNode root)
{if (root != null) Reverse(root);return root;
}//对以指定节点为根节点的二叉树进行镜像反转操作
private void Reverse(TreeNode node)
{//检测是否满足镜像反转要求if (node == null || (node.left == null && node.right == null)) return;if (node.left != null) Reverse(node.left);//对当前节点的左孩子节点进行镜像反转操作if (node.right != null) Reverse(node.right);//对当前节点的右孩子节点进行镜像反转操作SwapChildren(node);//交换当前节点的左右孩子节点
}//交换指定节点的左右孩子节点
private void SwapChildren(TreeNode node)
{if (node.left != null && node.right != null)(node.left, node.right) = (node.right, node.left);else if (node.left == null && node.right != null)(node.left, node.right) = (node.right, null);else if (node.left != null && node.right == null)(node.right, node.left) = (node.left, null);
}
算法解说

       根据题目要求我们需要对一个二叉树进行翻转操作,主方法的输入是该二叉树的根节点,返回值也是一个节点。实际上我们可以对问题进行细分,对二叉树的翻转实际上就是对二叉树节点的交换或者说是将每个节点的位置进行重新排序,有的节点的位置保持不变(如根节点),有的节点则需要与其它节点交换位置(如叶子节点等)。

       对问题进行转换后,我们自然需要对整个二叉树进行遍历,那么我们就需要搞清楚两个问题。

       1.什么时候交换节点?

       2.怎么交换节点?

       如图1和图2我们列举出了本题目将会出现的两种二叉树,根据这两种二叉树我们去找到上面两个问题的答案,具体思路请参考算法分析。

       如何将算法分析转换为代码,依旧是确定两个点,一是变量,二是逻辑主体,本题目的算法分析中并没有要求需要单独定义变量去记录数据,所以我们只看逻辑主体即可,代码示范中,我们将节点交换方法独立出来,以方便维护以及增加可读性,由于我们采用的是递归方式遍历二叉树,所以进行二叉树反转的逻辑我们也将其单独定义为一个函数。

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

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

相关文章

C#与C++交互(2)——ANSI、UTF8、Unicode文本编码

【前言】 我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们…

EFLFK——ELK日志分析系统+kafka+filebeat架构

环境准备 node1节点192.168.40.16elasticsearch2c/4Gnode2节点192.168.40.17elasticsearch2c/4GApache节点192.168.40.170logstash/Apache/kibana2c/4Gfilebeat节点192.168.40.20filebeat2c/4G https://blog.csdn.net/m0_57554344/article/details/132059066?spm1001.2014.30…

网络安全的相关知识点

网络安全威胁类型: 1.窃听:广播式网络系统。 2.假冒 3.重放:重复一份报文或者报文的一部分,以便产生一个被授权的效果。 4.流量分析 5.数据完整性破坏 6.拒绝服务 7.资源的非授权使用 8.陷门和特洛伊木马:木马病毒有客…

2023年国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

vue-element-admin动态菜单(后台获取)

vue-element-admin动态菜单(后台获取),此教程面向纯小白攻略,不要嫌我啰嗦,翻到自己需要的地方即可 前提 vue-element-admin官网: vue-element-admin (gitee.io) vue-element-admin页面展示:…

Redis复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate) 另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如下图所…

什么是伪类选择器?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 伪类选择器⭐ 一些常见的伪类选择器示例::hover:active:focus:nth-child(n):first-child 和 :last-child ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何…

关于Java中synchronized的实现原理

并发编程的三个理念 原子性:一个操作要么全部完成,要么全部失败。可见性:当一个线程对共享变量进行修改后,其他线程也应立刻看到。有序性:程序按照顺序执行 synchronized基本使用 修饰静态方法,锁的是类…

pycorrector一键式文本纠错工具,整合了BERT、MacBERT、ELECTRA、ERNIE等多种模型,让您立即享受纠错的便利和效果

pycorrector:一键式文本纠错工具,整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多种模型,让您立即享受纠错的便利和效果 pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正,pytho…

每天一道leetcode:300. 最长递增子序列(动态规划中等)

今日份题目: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] …

【力扣每日一题】1572. 矩阵对角线元素的和 8.11打卡

文章目录 题目思路代码 题目 1572. 矩阵对角线元素的和 难度: 简单 描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 返回合并后的二叉树。 注意…

Python web实战之Django 的缓存机制详解

关键词:Python、Web 开发、Django、缓存 1. 缓存是什么?为什么需要缓存? 在 Web 开发中,缓存是一种用于存储数据的临时存储区域。它可以提高应用程序的性能和响应速度,减轻服务器的负载。 当用户访问网页时&#xff…