LeetCode-验证二叉树的前序序列化

算法记录

LeetCode 题目:

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

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


说明

一、题目

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true
复制代码

二、分析

  • 二叉树的节点如果存在那么他必定存在两个子节点,不管这两个子节点是为 null 还是一棵完整的子树,如果当前节点为 null 就不能够往下面在拼接其他节点了。
  • 按照上面的定义,我们只需要用一个节点数量的标记,每当遍历一个非空节点就说明还有两个节点需要配对并且配对了上一次记录的一个节点,也就是 +2-1 的操作,整个节点数量 +1 ,如果遇见了 # 节点就表示当前路径结束,只需要把配对的之前节点数量 -1 即可。
  • 如果中间出现了节点数量等于零,就表示当前已知序列不满足,最后遍历完成还需要判断遍历到额节点数是否刚好满足整个序列的节点配对情况。
class Solution {
    private Integer total = 0;
    public boolean isValidSerialization(String preorder) {
        String[] root = preorder.split(",");
        int slot = 1;
        for(int i = 0; i < root.length; i++) {
            if(slot == 0) return false;
            if("#".equals(root[i])) slot--;
            else slot++;
        }
        return slot == 0;
    }
}
复制代码

总结

二叉树的特点。

猜你喜欢

转载自juejin.im/post/7107577418474323981
今日推荐