IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 331.验证二叉树的前序序列化 -> 正文阅读

[数据结构与算法]331.验证二叉树的前序序列化

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

来自 https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/

方法一:栈

槽位:

一个槽位可以看作是二叉树中待填充的位置

具体:

1. 当遇到空节点时,要消耗一个槽位,槽位数量-1
因为空节点没有子节点
2. 当遇到非空节点时,要消耗一个槽位,且新增加了两个槽位
因为非空节点有两个子节点(子节点可能空也可能非空)

结合题目:

使用栈来维护槽位的变化
1. 当遇到空节点时,栈顶槽位数-1
2. 当遇到非空节点时,栈顶槽位数-1,再压入一个槽位数为2的

遍历结束后,若栈为空,说明槽位都填满了,合法
若栈非空,序列不合法
遍历过程中,若槽位不足,则序列不合法

代码

class Solution {
    public boolean isValidSerialization(String preorder) 
    {
        String[] c=preorder.split(",");
        if(c[0].equals("#")&&c.length==1)
        {
            return true;
        }
        if(c[0].equals("#")&&c.length!=1)
        {
            return false;
        }
        Deque<Integer> d=new LinkedList<>();
        d.push(2);
        for(int i=1;i<c.length;i++)
        {
            //System.out.println(d.peek());
            if(d.isEmpty())
            {
                return false;
            }
            int peek=d.poll();
            if(peek!=1)
            {
                d.push(--peek);
            }
            if(!c[i].equals("#"))
            {
                d.push(2);
            }
        }
        if(d.isEmpty())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

注意

1. split方法返回的是一个String数组
2. String类型的和"…"比较时,不能用==,得用equals方法

优化

计数:

只用一个值计算槽位数
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 16:00:39  更:2021-09-20 16:01:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 11:14:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码