【LEETCODE】71、验证二叉树的前序序列化

简单粗暴,代码有待优化,不过自己独立完成,没有参考任何材料,还是比较满意的

package y2019.Algorithm.stack.medium;

import java.util.Stack;

/**
 * @Auther: xiaof
 * @Date: 2019/12/6 09:06
 * @Description:331. 验证二叉树的前序序列化
 *
 * 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,
 * 我们可以使用一个标记值记录,例如 #。
 *
 *      _9_
 *     /   \
 *    3     2
 *   / \   / \
 *  4   1  #  6
 * / \ / \   / \
 * # # # #   # #
 * 例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。
 * 给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
 * 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。
 * 你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3" 。
 *
 * 示例 1:
 * 输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
 * 输出: true
 * 示例 2:
 * 输入: "1,#"
 * 输出: false
 * 示例 3:
 * 输入: "9,#,#,1"
 * 输出: false
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 */
public class IsValidSerialization {

    /**
     * 执行用时 : 10 ms , 在所有 java 提交中击败了 43.30% 的用户
     * 内存消耗 : 35.5 MB , 在所有 java 提交中击败了 97.06% 的用户
     * @param preorder
     * @return
     * by xiaof 2019年12月6日10:09:08
     */
    public boolean solution(String preorder) {
        if ("#".equals(preorder)) {
            return true;
        }
        String[] eles = preorder.split(",");
        boolean isRight = false;
        //默认就是左节点,如果是右节点是#,那么就出栈,如果是左节点是#,那么就切换左右
        Stack stack = new Stack(); //如果栈为空的时候,还有最后一个#,那么正好跳出循环
        int index = 0;
        String curEle = eles[0];
        stack.push(eles[index]);
        //开始遍历后续元素
        for (index = 1; index < eles.length; ++index) {
            if ("#".equals(curEle) && isRight) {
                return false;
            }
            if ("#".equals(eles[index])) {
                isRight = true;
                if (stack.isEmpty()) {
                    //如果栈已经空了
                    break;
                }
                curEle = stack.pop();
            } else {
                stack.push(eles[index]);
                isRight = false;
            }
        }

        return stack.isEmpty() && index == (eles.length - 1);

    }

    public static void main(String[] args) {
        String s = "9,3,4,#,#,1,#,#,2,#,6,#,#";
        String s1 = "1,#";
        String s2 = "1";
        String s3 = "#";
        String s4 = "#,#";

        IsValidSerialization fuc = new IsValidSerialization();

        fuc.solution(s4);

    }

}

Original: https://www.cnblogs.com/cutter-point/p/11993633.html
Author: cutter_point
Title: 【LEETCODE】71、验证二叉树的前序序列化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570666/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 方法习题记录

    1、1的阶乘到20的阶乘之和 /** * 1&#x7684;&#x9636;&#x4E58;&#x5230;20&#x7684;&#…

    Java 2023年6月6日
    060
  • Android 布局及常用属性

    一、常用属性 控件宽度:layout_width wrap_content match_parent 控件高度:layout_height wrap_content match_p…

    Java 2023年6月5日
    069
  • Kafka简单使用

    package com.hgc.center.accounts.test; import java.util.Collections;import java.util.Proper…

    Java 2023年6月16日
    040
  • Java你可能不知道的事(3)HashMap

    概述 HashMap对于做Java的小伙伴来说太熟悉了。估计你们每天都在使用它。它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作…

    Java 2023年6月13日
    077
  • ELK安装过程中一些注意的地方

    安装流程比较简单,只需要下载安装包,解压安装包,修改配置文件,然后启动组件即可,但还是遇到一些小问题,这里做一下记录。 各个组件版本号需要保持一样,例如都使用 7.1.1版本 es…

    Java 2023年6月5日
    042
  • H3CNE实验笔记

    telnet远程登录 实验拓扑 [H3C]telnet server enable [H3C]int g0/0 [H3C-GigabitEthernet0/0]ip add 192…

    Java 2023年6月6日
    072
  • CocosCreator实现微信排行榜

    1. 概述 不管是在现实生活还是当今游戏中,各式各样的排名层出不穷。如果我们做好一款游戏,却没有实现排行榜,一定是不完美的。排行榜不仅是玩家了解自己实力的途径,也是游戏运营刺激用户…

    Java 2023年6月13日
    059
  • JavaWeb重定向及实现

    JavaWeb重定向及实现 重定向,就是将浏览器发送过来的请求有一个server转由另一个server处理。有两种实现方式,一是服务器内部进行重定向。二是将另一个server的地址…

    Java 2023年6月8日
    095
  • Java基础-续1

    方法 概念 在JS中,我们把方法称之为函数。在java我们称之为方法。 方法就是一个黑匣子。我们不需要知道内部是如何执行的,只要按照要求调用,就能完成必要的功能。 方法申明的语法:…

    Java 2023年6月7日
    057
  • 设计模式 — Bridge(桥模式)

    桥模式(Bridge) 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化 如何应对这种多维度的变化?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至…

    Java 2023年6月16日
    0100
  • Linux 系统安全加固经验总结

    本文为博主原创,转载请注明出处: 1. 禁止root密码登录 修改 /etc/ssh/sshd_config 中 允许root 用户登录 PermitRootLogin 的值改为 …

    Java 2023年6月8日
    054
  • JAVA入门[23]-SpringBoot配置Swagger2

    一、新建SpringBoot站点1.新建module,然后引入pom依赖: 2.新建Controller文件 3.新建SpringBoot启动文件 4.运行,http://loca…

    Java 2023年5月29日
    076
  • android解决W/System.err: retrofit2.adapter.rxjava3.HttpException: HTTP 400 Bad Request 错误

    接口请求中加header有时400报错,请求失败 查看信息应该是header传值有问题,语法格式有误,可能是header中有特殊字符为编码,服务器无法理解此请求。尝试fix,将he…

    Java 2023年5月29日
    084
  • Java EE发展史

    参阅公众号 BAT的乌托邦-Java EE 专栏 posted @2021-07-26 16:06 March On 阅读(105 ) 评论() 编辑 top last Welco…

    Java 2023年5月29日
    063
  • C#.NET WinForm 多个子Task嵌套 Task.WaitAll 阻塞UI线程

    C#.NET WinForm 多个子Task(子线程)嵌套 Task.WaitAll 阻塞UI线程 (界面) 情况: DoIt()方法内,开了2个Task 执行任务,子任务中会更新…

    Java 2023年5月29日
    062
  • linux 与 windows 挖门罗币总结

    比特币之前一直很火,初次了解的时候才2000RMB一枚..看不懂哇,错失良机…当然了,看得懂也不买不起..当时还是穷学生. 最近又一直看到黑客利用linux漏洞挖门罗币…

    Java 2023年6月16日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球