# 「力扣」第 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

说明:因时间和个人精力关系,本题没有写详解,只给出了参考代码。

读者可以在「力扣」这道题的评论区和题解区找到适合自己的思路分析和代码。

如果确实需要我编写具体的解题思路,可以发邮件到 liweiwei1419@gmail.com 或者给本项目的 issue (opens new window) 留言。

参考代码

import java.util.ArrayDeque;
import java.util.Deque;

public class Solution {

    public boolean isValidSerialization(String preorder) {
        String[] splits = preorder.split(",");
        int len = splits.length;

        // 特判
        if (len == 1 && "#".equals(splits[0])) {
            return true;
        }

        // 因为空子树需要表示
        if (len < 3) {
            return false;
        }

        // 还没想清楚
        if (!"#".equals(splits[len - 1]) && !"#".equals(splits[len - 2])) {
            return false;
        }

        Deque<String> stack = new ArrayDeque<>();
        stack.push(splits[0]);

        for (int i = 1; i < len; i++) {
            while (!stack.isEmpty() && "#".equals(stack.peekLast())) {
                stack.removeLast();
                if (stack.isEmpty()) {
                    return false;
                }
                stack.removeLast();
            }
            stack.addLast(splits[i]);
        }
        return !stack.isEmpty() && "#".equals(stack.peekLast());
    }
}

作者:liweiwei1419 链接:https://suanfa8.com/stack/solutions-1/0331-verify-preorder-serialization-of-a-binary-tree 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/19/2024, 1:33:17 AM