验证二叉树的前序序列化

序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如#。

例如,上面的二叉树可以被序列化为字符串"9,3,4,#,#,1,#,#,2,#,6,#,#",其中#代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

每个以逗号分隔的字符或为一个整数或为一个表示null指针的'#'。

你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3"。

示例 1:

输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"

输出: true

示例 2:

输入: "1,#"

输出: false

示例 3:

输入: "9,#,#,1"

输出: false

要求在不重建树的情况下,判断一个字符串是否为某树的先序遍历序列。

使用递归求解。

若一个序列只有一个"#",显然这是正确的。

若一个序列的第一个元素不是"#",那么一个合法的序列一定可以分成三部分来看待:根(第一个元素),左子树(从第二个元素开始算起到第x个元素),右子树(从第x+1个元素算起到序列末尾)。因此,跳过第一个元素(根)后,我们在从第二个元素开始的子序列中,先尝试找到一棵完整的树(左子树),如果找不到,那么显然是不合法的。如果找到了,那么我们再从这棵完整的树后面开始,尝试找另一棵树(右子树),如果找不到,那么显然是不合法的。

从第一个元素开始,如果找到了一个完整的树,且长度和序列长度一致,那么就是合法的,否则就是非法的。

  • 空间复杂度:O(1)(注意,为了简便,我下面的代码因为用了一个数组放置从字符串中分离出来的序列,事实上是O(n),但其实这是可以省略的,并非算法本质)
  • 时间复杂度:O(n)
 public class Solution {
public boolean isValidSerialization(String preorder) {
String[] x = preorder.split(",");
if (findTree(x, 0) == x.length) {
return true;
}
return false;
}
private int findTree(String[] preorder, int start) {
if (preorder.length - start == 0) {
return -1;
}
if (preorder[start].equals("#")) {
return start + 1;
}
int left = findTree(preorder, start + 1);
if (left < 0) {
return -1;
}
int right = findTree(preorder, left);
if (right < 0) {
return -1;
}
return right;
}
}

Leetcode 331.验证二叉树的前序序列化的更多相关文章

  1. LeetCode 331. 验证二叉树的前序序列化(Verify Preorder Serialization of a Binary Tree) 27

    331. 验证二叉树的前序序列化 331. Verify Preorder Serialization of a Binary Tree 题目描述 每日一算法2019/5/30Day 27LeetCo ...

  2. Java实现 LeetCode 331 验证二叉树的前序序列化

    331. 验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如 #. _9_ / \ ...

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

    简单粗暴,代码有待优化,不过自己独立完成,没有参考任何材料,还是比较满意的 package y2019.Algorithm.stack.medium; import java.util.Stack; ...

  4. [Leetcode] 第331题 验证二叉树的前序序列化

    一.题目描述 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如 #. _9_ / \ 3 2 / \ / ...

  5. 331 Verify Preorder Serialization of a Binary Tree 验证二叉树的前序序列化

    序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录这个节点的值.如果它是一个空节点,我们可以使用一个标记值,例如 #.     _9_    /   \   3     2  ...

  6. [Swift]LeetCode331. 验证二叉树的前序序列化 | Verify Preorder Serialization of a Binary Tree

    One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...

  7. 【LeetCode】144. 二叉树的前序遍历

    144. 二叉树的前序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 输入:root = [1,null,2,3] 输出:[ ...

  8. LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)

    144. 二叉树的前序遍历 144. Binary Tree Preorder Traversal 题目描述 给定一个二叉树,返回它的 前序 遍历. LeetCode144. Binary Tree ...

  9. LeetCode二叉树的前序、中序、后序遍历(递归实现)

    本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...

随机推荐

  1. Java常用函数式接口--Consumer接口使用案例

    第一种方式: 第二种方式:

  2. echarts 添加Loading 等待。

    capturedsDetailsEcharts: function(id) { if (!id) { id = mini.get("chnNameCaptureds").getVa ...

  3. IE兼容只读模式

    表单input具有只读模式属性,一般来说,一般的浏览器都支持该属性,即readyonly,但IE不支持,只能寻找其兼容性. 第一种:unselectable='on' <input id=&qu ...

  4. 判断后台service是否在运行

    public static boolean isServiceRunning(Context mContext,String className) { boolean isRunning = fals ...

  5. DataGridView使用技巧(七、设定列宽和行高自动调整)----.NET

    DataGridView使用技巧(七.设定列宽和行高自动调整)----.NET 1) 设定行高和列宽自动调整 [VB.NET]' 设定包括Header和所有单元格的列宽自动调整DataGridView ...

  6. CPU性能的评价

    人们通常用benchmark 来衡量CPU的性能,常见的benchmark有dhrystone和coremark. 由于dhrystone 受编译器影响比较大,所以,结果不是很准确,现在大多采用cor ...

  7. mysql> set sql_mode='no_auto_value_on_zero';

    mysql> set sql_mode='no_auto_value_on_zero';

  8. 【Web应用-FTP】FTP 容量显示说明

    现象描述 Azure 门户显示的文件系统存储容量跟网站本身的磁盘空间不符. 问题分析 Azure Web 应用的文件系统存储用量和网站本身有关,具体容量如下所示: 但目前门户预览中关于 FTP 的容量 ...

  9. POJ Washing Clothes 洗衣服 (01背包,微变型)

    题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...

  10. config文件声明非系统节点的方法

    有一些自定义节点如果不声明会报出无法识别的节点 XXX 这时候要声明该节点 写法如下 <configSections> <!--声明一个节点组--> <sectionGr ...