[模版总结] - 树的基本算法1 - 遍历

news2024/11/27 12:52:14

树结构定义

一种非线性存储结构,具有存储“一对多”关系的数据元素集合

种类

  • General Tree
    • Trie
    • B/B+ 树
  • 二叉树
    • 满/完满/完全二叉树
      • 完美BT : 除了叶子结点外所有节点都有两个字节点,每一层都完满填充
      • 完全BT: 除最后一层以外其他每一层都完美填充,最后一层从左到右紧密填充
      • 完满BT:  除了叶子结点外所有节点都有两个字节点
    • 二叉搜索树 BST
      • 平衡BST 
        • 红黑树
        • 伸展树
        • 自平衡二叉查找树AVL
        • 替罪羊树
    • 线索二叉树
    • 霍夫曼树/最优二叉树

二叉树遍历方式

所有二叉树基本遍历时间复杂度均为:O(N), N代表结点数量。

前序遍历 (根左右)

  • 题目:Leetcode 144

递归写法 

由于前序的特性,他可以展示树结构的继承关系,所以通常前序遍历会用在复制/打印树结构,比如序列化/反序列化,打印文件系统结构。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        dc(root, res);
        return res;
        
    }

    private void dc(TreeNode root, List<Integer> res) {
        if (root==null) return;

        res.add(root.val);
        dc(root.left, res);
        dc(root.right, res);
    }
}

中序遍历 (左根右)

  • 题目:Leetcode 94

递归写法

中序遍历最常用就是打印BST结构

class Solution {
    List<Integer> res;
    public List<Integer> inorderTraversal(TreeNode root) {
        res = new ArrayList<>();
        dc(root);

        return res;
    }

    private void dc(TreeNode root) {
        if (root==null) return;

        dc(root.left);
        res.add(root.val);
        dc(root.right);
    }
}

后续遍历 (左右根) 

  •  题目:Leetcode 145​​​​​​

后续遍历由于特性是先搜索叶子结点,所以可以用来做一些叶子结点操作(删除叶子结点),还有一些归并操作(计算算术表达式)

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        dc(root, res);
        return res;
    }

    private void dc(TreeNode root, List<Integer> res) {

        if (root==null) return;

        dc(root.left, res);
        dc(root.right, res);
        res.add(root.val);
    }    
}

层级遍历 I - 自上而下

  • 题目:Leetcode 102

树/图类层级遍历直接BFS即可

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();

        if (root==null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);

        while (!q.isEmpty()) {
            int size = q.size();

            List<Integer> tmp = new ArrayList<>();
            for (int i=0; i<size; i++) {
                TreeNode curr = q.poll();
                tmp.add(curr.val);
                if (curr.left!=null) q.add(curr.left);
                if (curr.right!=null) q.add(curr.right);
            }
            res.add(tmp);
        }

        return res;
    }
}

层级遍历 II - 自下而上

  • 题目:Leetcode 107
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        
        if (root==null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);

        while (!q.isEmpty()) {
            int size = q.size();
            List<Integer> tmp = new ArrayList<>();
            for (int i=0; i<size; i++) {
                TreeNode curr = q.poll();
                if (curr.left!=null) q.add(curr.left);
                if (curr.right!=null) q.add(curr.right);
                tmp.add(curr.val);
            }

            res.add(0, tmp);
        }

        return res;
    }
}

ZigZag 遍历

  • 题目:Leetcode 103​​​​​
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        dfs(root, 0, res);
        return res;
    }

    private void dfs(TreeNode root, int height, List<List<Integer>> res) {
        if (root==null) return;
        if (res.size()<=height) res.add(new ArrayList<>());

        if (height%2==0) {
            res.get(height).add(root.val);
        } else {
            res.get(height).add(0, root.val);
        }

        dfs(root.left, height+1, res);
        dfs(root.right, height+1, res);
    }
}

一些特别的遍历: 

逐列遍历 

T: O(N + C\times RlogR) , N表示dfs遍历时间复杂度,C表示列数,R表示每一列的行数

  • 题目:Leetcode 314
class Solution {
    TreeMap<Integer, List<Pair<Integer, Integer>>> colMap;
    public List<List<Integer>> verticalOrder(TreeNode root) {
        if (root==null) return new ArrayList<>();

        colMap = new TreeMap<>();
        dfs(root, 0, 0);

        List<List<Integer>> res = new ArrayList<>();

        for (int idx: colMap.keySet()) {
            Collections.sort(colMap.get(idx), (a, b) -> {
                return a.getKey()-b.getKey();
            });

            List<Integer> tmp = new ArrayList<>();
            for (Pair<Integer, Integer> a: colMap.get(idx)) {
                tmp.add(a.getValue());
            }

            res.add(tmp);
        }

        return res;

    }

    private void dfs(TreeNode root, int row, int col) {
        if (root==null) return;

        colMap.putIfAbsent(col, new ArrayList<>());
        colMap.get(col).add(new Pair<>(row, root.val));

        dfs(root.left, row+1, col-1);
        dfs(root.right, row+1, col+1);
    }
}

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

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

相关文章

FaceBook登录提示密码错误的原因及解决方法

下面这一种类型的提示密码错误&#xff0c;大家首先能够想到的可能就是本身的账号密码有错误&#xff0c;但这个只代表其一。有一种情况的话&#xff0c;他可能根本不是账号或者密码的错误&#xff0c;他仅仅是因为注册的地方和登录的地方不太一样&#xff0c;也会造成这样的结…

【JavaEE初阶】IP协议简介

文章目录 前言&#x1f334;IP协议的概念&#x1f333;IP数据报&#x1f6a9;IPv4协议头格式&#x1f6a9;IPv6的诞生 &#x1f38d;IP地址&#x1f6a9;IP地址的格式&#xff1a;&#x1f6a9;IP地址的分类&#x1f388;网络号与主机号的划分 &#x1f6a9;特殊的IP地址&#…

QGIS之十九矢量投影

效果 步骤 1、准备数据 2、Qgis矢量投影 Qgis工具箱中搜索“投影” 3、结果

算法笔记-第七章-栈的应用(未完成)

算法笔记-第七章-栈的应用 栈的基本常识栈的解释一栈的解释二 栈的操作序列合法的出栈序列可能的出栈序列补充知识点 后缀表达式&#xff08;无优先级&#xff09; 栈的基本常识 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或删除操作的线性表。 栈的解释一 栈的…

Vue dev-tools的安装

安装 Vue 开发者工具&#xff0c;装插件调试Vue应用 1.通过谷歌应用商店来进行安装&#xff08;国外网站&#xff09; 2.极简插件&#xff1a; 搜索 Vue -> 下载解压 -> 浏览器扩展模式打开&#xff0c;开发者模式 -> 将解压的CRX文件拖拽安装 -> 插件详情 &…

YOLOV8目标识别——详细记录从环境配置、自定义数据、模型训练到模型推理部署

一、概述 Yolov8建立在Yolo系列历史版本的基础上&#xff0c;并引入了新的功能和改进点&#xff0c;以进一步提升性能和灵活性。Yolov8具有以下特点&#xff1a; 高效性&#xff1a;Yolov8采用了新的骨干网络、新的Ancher-Free检测头和新的损失函数&#xff0c;可在CPU到GPU的…

在SpringBoot中使用EhCache缓存

在使用EhCache缓存之前&#xff0c;我们需要了解的是EhCache缓存是啥&#xff1f; Ehcache的概述 Ehcache是一个开源的Java缓存框架&#xff0c;用于提供高效的内存缓存解决方案&#xff0c;他可以用于缓存各种类型的数据&#xff0c;包括对象&#xff0c;查询结果&#xff0…

软件测试行业趋势分析

1 绪论 本文先对互联网对时代和社会变革进行了论述&#xff0c;然后再由互联网时代对软件工业模式变革进行了介绍&#xff0c;最后引出附属于软件工业的测试行业在新形势下的需求变化&#xff0c;并对趋势进行了分析&#xff0c;并最终给出了相关的从业人员的职业发展建议。 …

3DMAX建模基础教程:实例与复制

3D Studio Max&#xff0c;或称3DMAX&#xff0c;是一种专业的三维计算机图形软件&#xff0c;被广泛应用于电影、电视、游戏开发等领域。以下是一份关于3DMAX建模基础教程的实例与复制的详解。 3D模型实例化 实例化是一种重复使用相同对象的技术&#xff0c;而无需每次都创建…

搭建网站选择弹性云服务器

​ 弹性云服务器已成为建站的首选方案&#xff0c;弹性云服务器并从成本、灵活性、可扩展性和安全性等多个角度进行分析。 一、成本控制弹性云服务器以其优势的弹性计费模式&#xff0c;在建站初期成本控制中占据了重要地位。与传统的物理服务器相比&#xff0c;弹性云服务器可…

深度对话:以实在RPA Agent智能体安全机制破解LLM应用谜题

AI大模型席卷全球&#xff0c;为各个行业带来了颠覆式创新机遇&#xff0c;同时也打开了未知的潘多拉魔盒。随着大语言模型能力的不断增强和适用范围延伸&#xff0c;大模型本身带来的隐私泄漏、数据安全等问题越发成为各大厂商关注的核心&#xff0c;引发了各界更多的思考与发…

软件测试 —— 常见的自动化测试架构!

一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试功能函数库、测试数据源、测试对象识别标准&#xff0c;以及各种可重用的模块。这些组件作为小的构建模块&#xff0c;被组合起来代表某种商业流程。自动化测试…

组件库篇 | EUI | 快速上手

组件库篇 | EUI | 快速上手 导入组件库 仅需三个步骤便可以导入组件库&#xff1a; 进入main.cpp所在目录&#xff0c;将EUI文件夹复制到该目录下 双击sln文件使用vs打开项目&#xff0c;右键项目名-添加-新建筛选器&#xff0c;命名为EUI 将第1步导入的EUI文件夹拖入到第2步…

做C语言的编程题总是想骂人怎么办?

做C语言的编程题总是想骂人怎么办&#xff1f; 可能C语言的编程题难住了您吧&#xff0c;导致情绪激烈不平静&#xff0c;那么做C语言的编程题可以顺利-些吗? 当然有一些方法可是现实此目标的:最近很多小伙伴找我&#xff0c;说想要一些C语言的资料&#xff0c;然后我根据自己…

K8S的基础知识

K8S的意义与入门 专有名词 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问…

【C++初阶(八)】C/C++内存管理详解

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

C 语言指针怎么理解?

今日话题&#xff0c;C 语言指针怎么理解&#xff1f;让我用更简洁的方式来表达这个内容&#xff1a;就像桌面上的快捷方式一样&#xff0c;指针也可以有多层引用。我们可以将指针比作快捷方式的图标&#xff0c;快捷方式可以指向游戏&#xff08;普通指针&#xff09;&#xf…

人工智能基础_机器学习030_ElasticNet弹性网络_弹性回归的使用---人工智能工作笔记0070

然后我们再来看elastic-net弹性网络,之所以叫弹性是因为,他融合了L1和L2正则,可以看到 他的公式 公式中有L1正则和L2正则两个都在这个公式中 可以看到弹性网络,在很多特征互相联系的时候,非常有用,比如, 相关性,如果数学好,那么物理也好,如果语文好,那么英语也好 这种联系 正…

制作这种在线宣传画册,可轻松收获客户!

制作企业宣传画册&#xff0c;首先要了解企业制作宣传画册的需求以及展示方向&#xff0c;如今互联网时代&#xff0c;宣传画册的制作也应该要创新&#xff0c;而制作一本在线电子宣传画册用于线上宣传是非常有必要的。如何制作呢&#xff1f; 我们 可以使用FLBOOK平台在线制作…

bfc 简单理解及应用

1、概念 bfc 是 Block formatting context 的缩写&#xff0c;也就是块级格式化上下文&#xff0c;就是让元素形成独立的渲染区域&#xff0c;bfc容器内部的渲染对外部不会有影响。 2、形成bfc的常见条件 浮动 设置元素具有float: left/right绝对/固定定位&#xff1a;posit…