day23【代码随想录】翻转二叉树、对称二叉树、相同的树、另一棵树的子树、完全二叉树的结点个数
文章目录
- 前言
- 一、翻转二叉树(力扣226)
- 1、递归法
- 1、使用前序遍历
- 2、使用后序遍历
- 2、迭代法
- 1、层序遍历
- 二、对称二叉树(力扣101)
- 三、相同的树(力扣100)
- 四、另一棵树的子树(力扣572)
- 五、完全二叉树的结点个数(力扣222)
前言
1、翻转二叉树
2、对称二叉树
3、相同的树
4、另一棵树的子树
5、完全二叉树的结点个数
一、翻转二叉树(力扣226)
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
1、递归法
1、使用前序遍历
class Solution {public TreeNode invertTree(TreeNode root) {if(root==null)return root;TreeNode temp = root.left;root.left=root.right;root.right=temp;invertTree(root.left);invertTree(root.right);return root;}
}
2、使用后序遍历
class Solution {public TreeNode invertTree(TreeNode root) { if(root==null)return root;invertTree(root.left);invertTree(root.right);TreeNode temp = root.left;root.left=root.right;root.right=temp;return root;}
}
2、迭代法
1、层序遍历
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}ArrayDeque<TreeNode> deque = new ArrayDeque<>();deque.offer(root);while (!deque.isEmpty()) {int size = deque.size();while (size-- > 0) {TreeNode node = deque.poll();swap(node);if (node.left != null) {deque.offer(node.left);}if (node.right != null) {deque.offer(node.right);}}}return root;}public void swap(TreeNode root) {TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}
二、对称二叉树(力扣101)
给定一个二叉树,检查它是否是镜像对称的。
前中后序只能采用后序遍历
判断左子树右子树是否可以翻转,并将结果返回给根节点
左为空 右不为空 return false
右为空 左不为空 return false
左为空 右为空 return true
左 右数值不相等 return false
左 右数值相等 进行递归判断下一层结点
class Solution {public boolean isSymmetric(TreeNode root) {if(root!=null){return true;}return Compare(root.left,root.right);}public boolean Compare(TreeNode left,TreeNode right){//避免后续出现空指针的情况 所以先处理为空的条件if(left==null && right!=null) return false;else if(left!=null && right==null) return false;else if(left==null && right==null) return true;else if(left.val!=right.val) return false;//左右“节点”都不为空 且数值相等的情况//此时才进行递归 进行下一层判断boolean outside = Compare(left.left,right.right);boolean inside = Compare(left.right,right.left);boolean isSame = outside && inside;return isSame; }
}
三、相同的树(力扣100)
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路:
与第二题一致
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(p==null && q!=null) return false;else if(p!=null && q==null) return false;else if(p==null && q==null) return true;else if(p.val!=q.val) return false;//结点不为空且数值相等的情况boolean leftside = isSameTree(p.left,q.left);boolean rightside = isSameTree(p.right,q.right);return leftside && rightside;}
}
四、另一棵树的子树(力扣572)
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
思路:
将是否是子树的问题转化为是否相等的问题
判断两个树是否相等的三个条件(与的关系):
- 当前两个树的根节点值相等;
- 并且,s的左子树和t的左子树相等;
- 并且,s的右子树和t的右子树相等
判断t是否为s的子树的三个条件(或的关系): - 当前两棵树相等
- 或者,t是s的左子树
- 或者,t是s的右子树
class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {return dfs(root,subRoot);}public boolean dfs(TreeNode root,TreeNode subRoot){if(root==null) return false;boolean check = isSame(root,subRoot);boolean leftTree = dfs(root.left,subRoot);boolean rightTree = dfs(root.right,subRoot);return check || leftTree || rightTree;}public boolean isSame(TreeNode root, TreeNode subRoot){if(root==null && subRoot==null) return true;else if(root==null && subRoot!=null) return false;else if(root!=null && subRoot==null) return false;else if(root.val!=subRoot.val) return false;//根节点不为空且数值相等boolean left = isSame(root.left,subRoot.left);boolean right = isSame(root.right,subRoot.right);return left && right;}
}
五、完全二叉树的结点个数(力扣222)
给出一个完全二叉树,求出该树的节点个数。
把完全二叉树当做一棵普通的二叉树
可以用前中后层序遍历去统计结点数目
class Solution {public int countNodes(TreeNode root) {//后序遍历if(root==null)return 0;int leftNum = countNodes(root.left);int rightNum = countNodes(root.right);return leftNum+rightNum+1;}
}
利用完全二叉树特性
较难理解
class Solution {public int countNodes(TreeNode root) {//后序遍历// if(root==null)return 0;// int leftNum = countNodes(root.left);// int rightNum = countNodes(root.right);// return leftNum+rightNum+1;//完全二叉树特性if(root==null) return 0;TreeNode leftNode = root.left;TreeNode rightNode = root.right;int leftDepth = getDepth(root.left);int rightDepth = getDepth(root.right);if(leftDepth==rightDepth){//说明是满二叉树return (1 << leftDepth) + countNodes(root.right);}else {// 右子树是满二叉树return (1 << rightDepth) + countNodes(root.left);}}private int getDepth(TreeNode root) {int depth = 0;while (root != null) {root = root.left;depth++;}return depth;}
}
day23【代码随想录】翻转二叉树、对称二叉树、相同的树、另一棵树的子树、完全二叉树的结点个数相关推荐
- 代码随想录【day 14 二叉树】| 层序遍历 226.翻转二叉树 101.对称二叉树
代码随想录[day 14 二叉树]| 层序遍历 226.翻转二叉树 101.对称二叉树 层序遍历 卡哥文解 视频讲解 题目链接:102.二叉树的层序遍历 解题思路 代码实现 题目链接:107.二叉树的 ...
- 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...
- 【代码随想录】LC 102. 二叉树的层序遍历
目录 一.题目 1.原题链接 2.题目描述 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.知识风暴 一.题目 1.原题链接 力扣 2.题目描述 给你二叉树的根节点 root ,返回其节 ...
- 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)
一.相同的树 这道题是开胃菜的开始,使用递归进行解决 递归三部曲: 确定递归函数的参数和返回值 因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否 ...
- 二叉树-对称二叉树(递归法)
题意: 给定一个二叉树,检查它是否是镜像对称的. 中间划开,看是否对称 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 思路:(递归法) 这里镜像 ...
- 代码随想录算法训练营第十三天|102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树
链接:代码随想录 文章目录 102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树 解题方法 题目思路 示例代码 总结 解题思路 1.102.二叉树的层次遍历 解题思路 递归法,创立二维数组 ...
- 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
[题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...
- 【二叉树专题】—— 相同的树、对称二叉树、二叉树的最大深度
LeetCode 100: 相同的树 ⭕️ 解题思路: (1)特殊情况分析: 当两棵树都为空时,那么两棵树一定是相同的 如果两棵树的根结点的数值不同,那么两棵树一定是不相同的 如果两个树只有一棵树为空 ...
- 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)
这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...
最新文章
- LeetCode 191 Number of 1 Bits
- 新年新气象,祝所有朋友心想事成
- java lambdamart库,LambdaMART 之 lambda(示例代码)
- ICCV2015上的GazeTracker论文总结
- IntellijIDEA插件编写-删除/插入/替换文档内容
- Ubuntu10.04下安装Ns2的一系列错误及解决方案
- python怎么安装requests模块_python安装requests第三方模块
- 归纳下js面向对象的几种常见写法
- CSS margin合并
- NV21数据的镜像算法
- Excel文件计算机一级,计算机一级excel操作练习题文件
- 测评盘点2021十大淘宝购物优惠券app,高省是一个怎样的角色?
- 如何制作你自己的电脑游戏
- html站点根目在哪,10分钟了解Dreamweaver中站点根目录相对路径
- CMake安装mysql时报错:remove CMakeCache.txt and rerun cmake
- Apollo星火计划学习笔记|L1 Apollo平台安装(2021年9月更新)
- 常州大学计算机专业研究生怎么样,常州大学计算机应用技术考研经验
- CSR867x — 使用Sink Configuration Tool配置按键
- 如何在html上放小游戏,如何在网页插入小游戏
- 关于SuperSlide插件的使用
热门文章
- 【乐扣小题目】判断三角形
- echarts实现2d柱状_堆叠柱状图
- EditArea在线源码编辑器实例
- Cinelerra教程
- matlab imshow同时多,matlab怎么同时显示imshow 两幅图片
- 深入理解操作系统(10)第四章:处理器体系结构(2)Y86-64的顺序实现(包括:SEQ/指令的各阶段操作:取指,解码,执行,访存,回写,更新PC/序列指令/硬件结构/时序/阶段的实现/SEQ+)
- 从资源的角度统一看to C和to B商业模式
- linux基础学习6
- 游戏公司凌晨维护服务器,亲爱的冒险家:为提供给广大玩家更好的游戏体验,游戏预计将于4...
- Python学习:电影场次查询API