day15|各种遍历的应用

news2024/11/16 19:32:09

相关题目:
层次遍历会一打十
反转二叉树
对称二叉树

层次遍历会一打十

自底向上的层序遍历

在这里插入图片描述
实现思路:层次遍历二叉树,将遍历后的结果revers即可

public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> que = new ArrayDeque<>();
        if (root == null) {
            return res;
        }
        que.offer(root);
        int size = 0;
        while (!que.isEmpty()) {
            size = que.size();
            List<Integer> list = new ArrayList<>();
            while (size > 0) {
                TreeNode cur = que.poll();
                list.add(cur.val);
                if (cur.left != null) {
                    que.offer(cur.left);
                }
                if (cur.right != null) {
                    que.offer(cur.right);
                }

                size--;
            }
            res.add(list);
        }
        Collections.reverse(res);
        return res;
    }

输出二叉树的右视图节点

在这里插入图片描述
实现思路:层次遍历二叉树,记录二叉树每一层的节点数,到达该层最后一个节点时,将其加入到结果集即可

public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> que = new ArrayDeque<>();
        que.offer(root);
        int size = 0;
        while(!que.isEmpty()){
            size = que.size();
            while(size>0){
                TreeNode cur = que.poll();
                //遍历到该层最后一个节点
                if(size == 1){
                    res.add(cur.val);
                }
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
                size--;
            }
        }
        return res;
    }

二叉树每层的平均值

在这里插入图片描述
实现思路:层次遍历二叉树,计算每一层的平均值,注意:每层数之和及平均值的数据类型

public List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        Queue<TreeNode> que = new ArrayDeque<>();
        if(root == null){
            return res;
        }
        int size = 0;
        que.offer(root);
        while(!que.isEmpty()){
            size = que.size();
            double sum = 0;
            for (int i = 0; i < size; i++) {
                TreeNode cur = que.poll();
                sum += cur.val;
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
            }
            res.add(sum/size);
        }
        return res;
    }

N叉树的·层次遍历

在这里插入图片描述

class Node {
    public int val;
    public List<Node> children;

    public Node() {
    }

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};

public class LevelOrderNode {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Queue<Node> que = new ArrayDeque<>();
        que.offer(root);
        while (!que.isEmpty()) {
            int size = que.size();
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                Node cur = que.poll();
                list.add(cur.val);
                List<Node> children = cur.children;
                if (children == null || children.size() == 0) {
                    continue;
                }
                for (Node child : children) {
                    if (child != null) {
                        que.offer(child);
                    }
                }
            }
            res.add(list);
        }
        return res;
    }

}

在二叉树的每一行中找最大值

在这里插入图片描述
实现思路:层次遍历二叉树,记录每一层的最大值

public List<Integer> largestValues(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> que = new ArrayDeque<>();
        int size = 0;
        que.offer(root);
        while(!que.isEmpty()){
            size = que.size();
            int max = Integer.MIN_VALUE;
            while(size>0) {
                TreeNode cur = que.poll();
                max = Math.max(max,cur.val);
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
                size--;
            }
            res.add(max);
        }
        return res;
    }

填充每个节点的下一个右侧节点指针

在这里插入图片描述
实现思路:层次遍历二叉树,记录每层元素个数,遍历每层元素,元素个数大于1时,使其next指针指向队头元素;元素个数为1时,使其next指针指向null即可

class NodeText {
    public int val;
    public NodeText left;
    public NodeText right;
    public NodeText next;

    public NodeText() {}

    public NodeText(int _val) {
        val = _val;
    }

    public NodeText(int _val, NodeText _left, NodeText _right, NodeText _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
public class Connect {
    public NodeText connect(NodeText root) {
        Queue<NodeText> que = new ArrayDeque<>();
        if(root == null){
            return root;
        }
        que.offer(root);
        while(!que.isEmpty()){
            int size = que.size();
            while(size>0){
                NodeText cur = que.poll();
                if(size>1){
                    NodeText temp = que.peek();
                    cur.next = temp;
                }
                else{
                    cur.next =null;
                }
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
                size--;
            }
        }
        return root;
    }
}

求二叉树的最大深度

在这里插入图片描述
实现思路:层次遍历二叉树,记录树的层数

public int maxDepth(TreeNode root) {
        int maxDepth = 0;
        int size = 0;
        if(root == null){
            return 0;
        }
        Queue<TreeNode> que = new ArrayDeque<>();
        que.offer(root);
        while(!que.isEmpty()){
            maxDepth++;
            size = que.size();
            while(size>0){
                TreeNode cur = que.poll();
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
                size--;
            }
        }
        return maxDepth;
    }

求二叉树的最小深度

在这里插入图片描述

实现思路:层次遍历二叉树,当某个节点的左右孩子均为null时,输出该节点所在层数,及就是树的最小深度

public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int deep = 0;
        int size = 0;
        Queue<TreeNode> que = new ArrayDeque<>();
        que.offer(root);
        while (!que.isEmpty()) {
            deep++;
            size = que.size();
            while (size > 0) {
                TreeNode cur = que.poll();
                if (cur.left == null && cur.right == null) {
                    return deep;
                } else {
                    if (cur.left != null) {
                        que.offer(cur.left);
                    }
                    if (cur.right != null) {
                        que.offer(cur.right);
                    }
                }
                size--;
            }
        }
        return deep;
    }

反转二叉树(掌握递归遍历)

实现方法:使用前序遍历、后序遍历及其层次遍历均可实现
前序遍历实现方法:遍历中间节点,中间节点的左右孩子交换位置即可
后序遍历实现方法:遍历的左子树和右子树,交换中间节点左右孩子交换位置即可
层次遍历:遍历每一层的各个节点,反转各个节点的左右孩子即可

public class InvertTree extends TreeNode {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return null;
        }
//        //前序
//        swap(root);
//        invertTree(root.left);
//        invertTree(root.right);

//        //后序
//        invertTree(root.left);
//        invertTree(root.right);
//        swap(root);
        //层次遍历--迭代
        Queue<TreeNode> que = new ArrayDeque<>();
        int size = 0;
        que.offer(root);
        while(!que.isEmpty()){
            size = que.size();
            while(size>0){
                TreeNode cur = que.poll();
                swap(cur);
                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
                size--;
            }
        }

        return root;
    }
    public void swap(TreeNode root){
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}

对称二叉树

递归实现:
递归三部曲

  1. 确定递归函数的参数和返回值
    因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。
    返回值自然是bool类型。
    代码如下:
    bool compare(TreeNode* left, TreeNode* right)
  2. 确定终止条件
    要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
    节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)
  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true
  • 左右都不为空,比较节点数值,不相同就return false
    代码如下:
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; // 注意这里我没有使用else

注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。
3. 确定单层递归的逻辑
此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

  • 比较二叉树外侧是否对称 :传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称:传入左节点的右孩子,右节点的左孩子。

如果左右都对称就返回true ,有一侧不对称就返回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 && left.val != right.val) return false;
        else if (left == null && right == null) return true;
        boolean inside = compare(left.left, right.right);
        boolean outside = compare(left.right, right.left);
        return inside && outside;
    }
}

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

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

相关文章

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…

【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张

背景需求&#xff1a; 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;256种-CSDN博客文章浏览阅读318次&#xff0c;点赞10次&#xff0c;收藏12次。【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;256种https://blog.csdn.net/reasonsummer/…

联邦BGP

AR1&#xff1a; [Huawei]bgp 1 [Huawei-bgp]router-id 1.1.1.1 [Huawei-bgp]peer 12.1.1.2 as-number 2 [Huawei-bgp]network 10.1.1.1 24---宣告 AR8&#xff1a; [Huawei]bgp 3 [Huawei-bgp]router-id 8.8.8.8 [Huawei-bgp]peer 78.1.1.7 as-number 2 [Huawei-bgp]ne…

剖析镜面不锈钢氮气柜的种类和使用维护方法

镜面不锈钢氮气柜是一种高端的储存设备&#xff0c;专门设计用于保存对环境条件有严格要求的敏感物品。它采用了高品质的不锈钢材料&#xff0c;并通过精细的抛光处理达到镜面效果&#xff0c;不仅美观而且具备优秀的耐腐蚀性和易清洁性。柜体内利用氮气控制系统&#xff0c;通…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

内网安全之证书服务基础知识

PKI公钥基础设施 PKI(Public Key Infrastructure)公钥基础设施&#xff0c;是提供公钥加密和数字签名服务的系统或平台&#xff0c;是一个包括硬件、软件、人员、策略和规程的集合&#xff0c;用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。企业…

c【语言】了解指针,爱上指针(4)

了解指针&#xff0c;爱上指针&#xff08;4&#xff09; 字符指针变量数组指针变量二维数组传参的本质函数指针变量typedef关键字函数指针数组转移表 字符指针变量 如整型指针变量一样&#xff0c;它是指针变量的其中一个类型&#xff1a;char* 一般&#xff0c;我们是这样使…

通胀担忧仍存,美联储降息预期或又推迟

KlipC报道&#xff1a;周三&#xff0c;美联储公布4月30日至5月1日政策会议纪要&#xff0c;会议纪要显示美联储对通胀仍感到担忧&#xff0c;将更长时间维持利率不变&#xff0c;必要时进一步收紧政策。 尽管在前不久公布的4月CPI数据显示通胀有所缓解&#xff0c;但是被认为…

网站如何建设

#### 环境准备 - 安装Java Development Kit (JDK)&#xff1a;这是Java开发的基础&#xff0c;用于编译Java源代码。 - 安装Web服务器&#xff1a;常用的有Tomcat、Jetty、GlassFish或JBoss。它们负责将Java应用程序部署到Web上&#xff0c;并处理来自客户端的请求。 - 安装…

flutter开发实战-美颜前后对比图效果实现

flutter开发实战-美颜前后对比图效果实现 最近使用代码中遇到了图片前后对比&#xff0c;这里使用的是CustomClipper来实现 一、CustomClipper 我们实现CustomClipper子类来实现美颜后的图片裁剪功能 getClip()是用于获取剪裁区域的接口&#xff0c;由于图片大小是6060&am…

一张SSL证书如何同时保护多个域名及其子域名?

在互联网时代&#xff0c;数据安全和隐私保护变得至关重要&#xff0c;而SSL证书作为确保网站安全的重要工具&#xff0c;其重要性不言而喻。本文将详细探讨一种特殊的SSL证书——多域名通配符SSL证书&#xff0c;它为网站管理员提供了一种高效、经济的方式来保护多个域名及其子…

第一后裔加速器推荐 第一后裔免费加速器用哪个

知名游戏开发商NEXON对于许多老玩家来说都不会陌生&#xff0c;它旗下的泡泡堂和DNF可谓是一代人的青春。就在最近NEXON又为玩家们带来了最新作品《第一后裔》&#xff0c;该款游戏为搭建在虚幻5引擎上的一款多人联机射击掉宝类游戏&#xff0c;一上线就受到了许多游戏玩家的关…

高速公路定向广播(声光一体) HT-600D

1、产品概述&#xff1a; HT-600D声光一体平面波IP定向广播是北京恒星科通创新性研发产品&#xff0c;采用公司自主研发的平面波传声技术&#xff0c;该产品具有高声压、强指向性、高清晰度等特点&#xff0c;采用定向声传声技术将声音聚集到正前方定向传输,周边声压级明显降低…

【EXCEL_VBA_实战】两组数据比对是否一致(字符串数组)

工作背景&#xff1a;比对两组数据是否一致&#xff08;位置非一一对应&#xff09; 思路构建&#xff1a;两组数据转换为两组字符串数组&#xff0c;比对所包含元素是否相同 问题点&#xff1a;A数组的第一个元素不一定与B数组的第一个元素对应&#xff0c;此时无法通过公式…

数据仓库和数据挖掘基础

文章目录 1. 数据仓库基础知识1.1 数据仓库的基本特性1.2 数据仓库的数据模式1.3 数据仓库的体系结构 2. 数据挖掘基础知识2.1 数据挖掘的分类2.2 数据挖掘技术2.3 数据挖掘的应用过程 传统数据库在联机事务处理(OLTP)中获得了较大的成功&#xff0c;但是对管理人员的决策分析要…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

tomcat jdbc连接池的默认配置配置方案

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

肌肤暗沉与胶原蛋白:解锁透亮肌肤的秘密

&#x1f338;亲爱的小仙女们&#xff0c;今天我们来聊聊肌肤暗沉与胶原蛋白之间的神秘联系。你是不是也曾为肌肤的暗沉而烦恼&#xff1f;其实&#xff0c;很多时候&#xff0c;肌肤的暗沉不仅仅是外部因素造成的&#xff0c;更与肌肤内部的胶原蛋白含量密切相关。&#x1f31…

element ui 下拉框Select 选择器 上下箭头旋转方向样式错乱——>优化方案

目录 前言1、问题复现2、预期效果3、input框样式修改解析4、修改方案 &#x1f680;写在最后 前言 测试A&#xff1a;那啥&#xff01;抠图仔&#xff0c;样式怎么点着点着就出问题了。 前端&#xff1a;啥&#xff1f;css样式错乱了&#xff1f;你是不是有缓存啊&#xff01…