[模版总结] - 树的基本算法3 - 结构转化

二叉树结构转化

  • 通常将二叉树根据某些要求进行结构重构,比如线性结构转化(链表,数组),序列化等。

常见题型

注:这类题目最基本的解题思路是利用递归分治 (也可以使用迭代方法),在构建树结构的时候,我们通常会使用前序遍历的思路自上而下,进行建树,每一次递归中,得到左右子树的值进行连接。

链表类

Leetcode 114 - Flatten Binary Tree to LinkedList

LeetCode 426 - Convert BST to Sorted Doubly Linked List

线性数组或字符类

Leetcode 297. 序列化和反序列化二叉树

Leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal

Leetcode 536. Construct Binary Tree from String

Leetcode 606. Construct String from Binary Tree

Leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal

二叉搜索树

Leetcode 449. Serialize and Deserialize BST

题目思路

Leetcode 114 - Flatten Binary Tree to LinkedList

将二叉树以前序遍历的顺序转化成连接结构,要求in-place即不占用额外空间存储新的链表结构。基本思路是递归分治,这里我们使用后序遍历的思路,先拿到左右结点然后转化成链表结构,在每一次递归中:

  1. 拿到左右子结点
  2. 如果左子树为空则直接返回右子树
  3. 如果左子树不为空,将左子树的最右边的结点与当前节点右子树连接,然后将当前节点右边连接到该左子树,然后将当前节点左子树置空。

代码如下:

class Solution {
    public void flatten(TreeNode root) {
        dfs(root);
    }

    private void dfs(TreeNode root) {
        if (root==null) return;
        if (root.left==null && root.right==null) return;

        dfs(root.left);
        dfs(root.right);

        if (root.left==null) return;
        else {
            TreeNode dum = root.left;
            while (dum.right!=null) {
                dum = dum.right;
            }
            dum.right = root.right;
            root.right = root.left;
            root.left = null;
        }
    }
}

Leetcode 606. Construct String from Binary Tree

二叉树序列化问题,根据二叉树前序遍历顺序将各节点按照继承关系打印出来

例子:[1,2,3,4] -> "1(2(4))(3)"

二叉树序列化,通常思路就是前序遍历依次打印各个节点,按照分治的思路,我们在每一次递归任务中,需要做以下步骤:

  1. 打印当前节点
  2. 打印左括号
  3. 遍历左子树
  4. 打印右括号
  5. 判断右子树是否为空,如果不为空重复 2,3(打印右子树),4。

代码如下:

时间复杂度:O(N) ; 空间复杂度:O(h) , h代表递归深度。

class Solution {
    StringBuilder str = new StringBuilder();
    public String tree2str(TreeNode root) {
        dfs(root);
        return str.toString();
    }

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

        str.append(root.val+"");

        if (root.left==null && root.right==null) return;

        str.append('(');
        dfs(root.left);
        str.append(')');

        // skip if right == null
        if (root.right!=null) {
            str.append('(');
            dfs(root.right);
            str.append(')');
        }
    }
}

 

Leetcode 536. Construct Binary Tree from String

这道题目则是上面LC.606的反序列化,通过给定序列化字符串构造原始的树结构,由于序列化后可以通过"()" 来判断节点的父子关系,这道题思路有一些类似Leetcode基础计算器或者表达式计算的问题,我们需要维护一个栈结构,在遍历字符串过程中:

  1. 如果遇到左括号,继续循环
  2. 如果遇到数字或者负号,读取数字位,创建结点并加入Stack中
  3. 如果遇到右括号,即需要开始处理结点父子关系,将最近结点pop出来,pop后栈中最顶上的结点一定是pop出结点的父亲结点,将当前节点连接到该父亲结点上,左优先如果左边不为空则连接到右子树。

代码如下:

时间复杂度:O(N) ; 空间复杂度:O(h) , h代表递归深度。

class Solution {
    public TreeNode str2tree(String s) {
        if (s==null || s.length()==0) return null;
        Stack<TreeNode> stk = new Stack<>();

        for (int i=0; i<s.length();) {
            if (s.charAt(i)=='(') {
                i++;
                continue;
            } else if (s.charAt(i)==')') {
                if (!stk.isEmpty()) {
                    TreeNode node = stk.pop();
                    TreeNode parent = stk.peek();
                    if (parent.left==null) parent.left = node;
                    else parent.right = node;
                }
                i++;
            } else {
                String num = "";
                while (i<s.length() && ((s.charAt(i)>='0' && s.charAt(i)<='9') || s.charAt(i)=='-')) {
                    num+=s.charAt(i);
                    i++;
                }

                TreeNode node = new TreeNode(Integer.parseInt(num));
                stk.push(node);
            }
        }

        return stk.pop();
    }
}

Leetcode 297. 序列化和反序列化二叉树

上面两道题目的合并版,比起使用上述括号形式进行序列化编码,这道题目我们可以对于序列化的格式进行简化,对于缺失的左右叶子结点我们用NULL来表示,每一个结点以逗号隔开。

对于反序列化的步骤,由于序列化是以前序遍历的顺序,所以反序列化也利用前序遍历的顺序,每一次递归过程中进行如下操作:

  1. 根据当前遍历的结点创建二叉树结点,并从列表中移除该结点
  2. 向下遍历左右子树,得到左右子树
  3. 将当前节点连接到左右子树,并返回当前节点

前序遍历的特性是根-左-右,是比较适合构建二叉树这类问题

代码如下:

public class Codec {
    StringBuilder str;
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        str = new StringBuilder();
        helper(root);

        return str.toString().substring(0, str.length()-1);
    }

    private void helper(TreeNode root) {
        if (root==null) {
            str.append("null,");
            return;
        }

        str.append(root.val+",");
        helper(root.left);
        helper(root.right);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        List<String> nodes = new LinkedList<String>(Arrays.asList(data.split(",")));
        return deshelper(nodes);
    }

    private TreeNode deshelper(List<String> nodes) {
        if (nodes==null || nodes.size()==0) return null;

        if (nodes.get(0).equals("null")) {
            nodes.remove(0);
            return null;
        }

        TreeNode curr = new TreeNode(Integer.parseInt(nodes.get(0)));
        nodes.remove(0);
        curr.left = deshelper(nodes);
        curr.right = deshelper(nodes);

        return curr;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有什么进销存软件,比较适合零售行业日常开单要求及库存记录?

本文将为大家总结一下对于进销存软件要求&#xff1a; 基础功能&#xff1a;可以日常开单、退换货处理、出入库进阶功能&#xff1a;电脑、手机数据同步&#xff0c;保障数据安全&#xff0c;可进行数据分析 其实无论是小型创业公司&#xff0c;还是一家大型企业&#xff0c;…

Linux下好玩的指令(持续更新)

适用于centOS下&#xff0c;别的Linux换个指令就行&#xff0c;内容是一样的 centOS有的指令安装不了&#xff1f;试试拓展yum源&#xff0c;再安装基本就OK啦&#xff01; yum install -y epel-release 下面是作者在centOS环境下亲测可以使用的&#xff0c;如果你是root用户直…

软件测试/测试开发丨掌握未来,引领人工智能测试新潮流!

点此领取人工智能课程 在数字化革命的浪潮中&#xff0c;人工智能软件成为企业创新和成功的关键推动力。为了在这个竞争激烈的市场中脱颖而出&#xff0c;精湛的人工智能软件测试技能变得至关重要。 ChatGPT应用实战&#xff1a; 学员将深入了解 ChatGPT 的实际应用&#xf…

微服务和Spring Cloud Alibaba介绍

1、微服务介绍 1.1 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构 —> 垂直应用架构 —> 分布 式架构—>…

2022年6月 电子学会青少年软件编程 中小学生Python编程 等级考试一级真题答案解析(判断题)

2022年6月Python编程等级考试三级真题解析 判断题(共10题,每题2分,共20分) 26、运行下列python代码后可绘制出下面的半径为50的圆形 import turtle turtle.color(red) turtle.penup() turtle.circle(50) turtle.pendown() 答案:错 考点分析:考查turtle模块的使用,程…

为什么阿里不推荐使用 keySet() 遍历HashMap?

为什么阿里不推荐使用 keySet() 遍历HashMap&#xff1f; HashMap相信所有学Java的都一定不会感到陌生&#xff0c;作为一个非常重用且非常实用的Java提供的容器&#xff0c;它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多…

Java爬取哔哩哔哩视频(可视化)

链接&#xff1a;我的讲解视频https://www.bilibili.com/video/BV14e411Q7oG/ 本文仅供学术用途 先上图 代码 爬虫核心 import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.gargoylesoftware.htmlunit.*; import org.apache.commons.…

系列二十六、idea安装javap -c

一、概述 javap -c是一个能够将.java文件反编译为.class文件的指令&#xff0c;例如我在idea中编写了一个Car.java文件&#xff0c;我想看看这个类被编译后长什么样的&#xff0c;就可以使用该指令进行查看。 二、配置 2.1、 Java Bytecode Decompiler File>Settings>Pl…

大数据分析与应用实验任务八

大数据分析与应用实验任务八 实验目的 进一步熟悉pyspark程序运行方式&#xff1b;熟练掌握pysaprk RDD基本操作相关的方法、函数。 实验任务 进入pyspark实验环境&#xff0c;在图形界面的pyspark命令行窗口中完成下列任务&#xff1a; 在实验环境中自行选择路径新建以自…

非对口专业测试人,婉拒猎头、放弃6份高薪offer,你敢信?

从非对口的国贸专业&#xff0c;步入测试之路&#xff1b;从红色旅游小城湘潭&#xff0c;迈入国际化都市上海。“明确方向-及时实践-谨慎选择-踏实扎根-计划未来”。她的每一步&#xff0c;都走得格外坚定有力......话不多说&#xff0c;让我们一起来看看这位小姐姐的成长故事…

PyTorch:张量与矩阵

PyTorch 是一个基于 Python 的科学计算包&#xff0c;专门针对深度学习研究&#xff0c;提供了丰富的工具和库。在 PyTorch 中&#xff0c;张量&#xff08;tensor&#xff09;是深度学习的核心数据结构&#xff0c;它可以看作是可以进行自动微分的多维数组。张量不仅可以代表标…

DSVPN简介

定义 动态智能VPN&#xff08;Dynamic Smart Virtual Private Network&#xff09;&#xff0c;简称DSVPN&#xff0c;是一种在Hub-Spoke组网方式下为公网地址动态变化的分支之间建立VPN隧道的解决方案。 目的 越来越多的企业希望建立Hub-Spoke方式的IPSec VPN网络将企业总部…

Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题&#xff0c;我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是…

解决Tomcat中文乱码

cmd乱码如图&#xff1a; idea中运行Tomcat控制台出现乱码&#xff1a; 解决办法&#xff1a; 找到两个idea的vmoptions配置文件&#xff0c;在文件中追加-Dfile.encodingUTF-8 -Dfile.encodingUTF-8保存退出。 重启idea重新运行Tomcat&#xff1a; maven、tomcat 超级详…

什么是 SSL?SSL/TLS是如何工作的?HTTP和HTTPS有什么区别?

SSL 代表安全套接字层&#xff0c;是指用于加密、保护和验证互联网上之通信的协议。尽管 SSL 在一段时间前已被称为 TLS&#xff08;传输层安全性&#xff09;的更新协议代替&#xff0c;但“SSL”仍是该技术的常用术语。 SSL/TLS 的主要用例是保护客户端和服务器之间的通信安…

解决requests库中session.verify参数失效的问题

在使用requests库进行HTTP请求时&#xff0c;如果在环境变量中设置了’REQUESTS_CA_BUNDLE’&#xff0c;并且在session对象中设置了verify参数为False&#xff0c;那么API请求会使用环境变量中的值而不是session对象中的值。这是因为在requests库中&#xff0c;当session对象中…

Find My婴儿车|苹果Find My技术与婴儿车结合,智能防丢,全球定位

婴儿车是一种为婴儿户外活动提供便利而设计的工具车&#xff0c;是宝宝最喜爱的散步交通工具&#xff0c;更是妈妈带宝宝上街购物时的必须品。随着现在三胎的放开&#xff0c;婴儿车市场已经迎来上升的趋势。 在智能化加持下&#xff0c;防丢功能的加入使得人们日益关心物品的…

深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

TEMU要求提交RSL Report 铅镉RSL邻苯项目化学物质检测报告

TEMU要求提交RSL Report 铅镉RSL邻苯项目化学物质检测报告 如果您在亚马逊上销售商品&#xff0c;则必须遵守所有适用的欧盟和地方法律法规&#xff0c;以及适用于这些商品和商品信息的亚马逊政策。要在亚马逊上销售某些商品&#xff0c;( xxdu2016 )您需要向我们提供 REACH 符…

mybatis-plus3.5.3.1 支持不同数据源sql适配

mybatis-plus3.5.3.1 支持不同数据源sql适配 背景 最近公司要求支持国产数据库达梦&#xff0c;人大金仓&#xff0c;高斯等数据库&#xff0c;这些数据库与mysql的语法有一些差异&#xff0c;需要做一些兼容操作。 解决问题 1.不同数据库分页不同 2.支持通过参数控制执行…
最新文章