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

相关文章

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)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

hashmap的存值,各种遍历方法

package com.jefflee;import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class HashmapTest {// 遍历Hashmap的四种方法public static void main(String[] args) {//hashmap可以存一个null,把

Knight Moves -uva 简单的BFS遍历

昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使