Day15.二叉树part02: 层序遍历、226.翻转二叉树 、 101. 对称二叉树

2024-03-22 14:12

本文主要是介绍Day15.二叉树part02: 层序遍历、226.翻转二叉树 、 101. 对称二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Day15.二叉树part02: 层序遍历、226.翻转二叉树 、 101. 对称二叉树

102.二叉树的层序遍历

原题链接

代码随想录链接

刚开始看的时候感觉不会写,因为一直对树的算法题很抵触就是感觉自己搞不明白,不过现在就感觉干就完了!

不会写的时候去看了卡哥的解析,当提示到可以使用队列来写的时候我脑子里就瞬间有了想法,这不是和昨天的二叉树迭代遍历有点类似吗,于是自己去想好了思路写完代码果然通过了。

思路如下:

  • 创建一个队列用于顺序存放每一层的元素
  • 先将树的根节点放入队列后开始一个while循环,循环终止的条件是队列为空;
  • while循环里先定义一个size用于代表当前队列的长度,然后在定义一个List集合用于存放每层的节点的val值并最终将它们放入结果集合中;
  • 之后再内嵌一个while循环,终止条件为size等于0时代表已经遍历完了当前这层树的节点;
  • 内嵌循环中先将队列头结点出队,并将出队节点的val值存入到小集合中,然后再判断出队节点是否有左右孩子,如果有的话也将它们加入队列中
  • 内嵌循环结束后小集合添加到结果集合中,最后返回最终结果集合;

java源代码如下:

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<List<Integer>>();Queue<TreeNode> queue = new LinkedList<>();if(root == null){return result;}else{queue.offer(root);}while(queue.size() > 0){int size = queue.size();List<Integer> res = new ArrayList<>();while(size > 0){TreeNode node = queue.poll();res.add(node.val);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);size--;}result.add(res);}return result;}
}

226.反转二叉树

原题链接

代码随想录链接

本题可以用递归和迭代两种方式做,我们先来看第一种方法

递归法

这里用到的是后序遍历递归,先遍历左节点,然后遍历右节点,最后把父节点的左右子树交换。

java代码如下:

class Solution {public TreeNode invertTree(TreeNode root) {if(root == null){return root;}invertTree(root.left);invertTree(root.right);swapNode(root);return root;}public void swapNode(TreeNode node){TreeNode temp = node.left;node.left = node.right;node.right = temp;}
}

迭代法

用递归可以做的用栈也可以做!

步骤如下:

1.新建一个栈并让根节点入栈如下图

在这里插入图片描述

2.让栈顶元素出栈,并交换该元素的左右孩子后,将它的左右孩子也入栈,如下图

在这里插入图片描述

3.之后再将栈顶元素出栈,这样一直循环直到栈内为空

java代码如下:

class Solution {public TreeNode invertTree(TreeNode root) {if(root == null){return root;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){TreeNode node = queue.poll();swapNode(node);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);}return root;}public void swapNode(TreeNode node){TreeNode temp = node.left;node.left = node.right;node.right = temp;}
}

本题也可以用层序遍历来写,也就是依靠队列。

101.对称二叉树

原题链接

代码随想录链接

本题可以用递归和迭代两种方法,这里只写迭代的具体实现

1.先定义一个普通队列,然后将根节点的左右孩子加入队列中,如下图

在这里插入图片描述

2.接着while循环,当队列为空时退出循环,循环里先将queue的前两个元素poll出去,并分别定义为左节点和右节点,如下图

在这里插入图片描述

3.然后进行判断两节点是否相等等等这些因素,再把左节点的左孩子、右节点的右孩子、左节点的右孩子,右节点的左孩子按顺序加入队列,如下图

在这里插入图片描述

4.之后直到循环结束

java代码如下:

class Solution {public boolean isSymmetric(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while(!queue.isEmpty()){TreeNode left = queue.poll();TreeNode right = queue.poll();//这里应该为continue而不是return trueif(left == null && right == null){continue;//判断条件注意}else if(left == null || right == null || left.val != right.val){return false;}queue.offer(left.left);queue.offer(right.right);queue.offer(left.right);queue.offer(right.left);}return true;}
}
        queue.offer(left.left);queue.offer(right.right);queue.offer(left.right);queue.offer(right.left);}return true;
}

}


这篇关于Day15.二叉树part02: 层序遍历、226.翻转二叉树 、 101. 对称二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835455

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具