LeetCode331:验证二叉树的前序序列化

0x00.题目链接:

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

0x01.解题思路:

  借鉴官方解答的思路,引入“槽位”的概念。所谓“槽位”,即为该序列中仍可出现的‘#’的个数。每当遍历至数字,槽位+1(因为数字由左右子节点,可+2槽位,同时其本身消耗1槽位);遍历至‘#’,槽位-1。因此,可定义一个整型变量vol记录当前槽位数,其初始值为1。

  该序列为二叉树前序序列的充要条件为:槽位在遍历字符串的过程中一直保持大于零,且在遍历结束后恰等于零。

0x02.代码

class Solution {
public:
    bool isValidSerialization(string preorder) {
        int vol=1,n=preorder.size(),i=0;
        while(i<n){
            if(vol==0)    return false;
            if(preorder[i]=='#')    vol--;
            else if(preorder[i]>='0'&&preorder[i]<='9'){
                while(preorder[i]>='0'&&preorder[i]<='9')    i++;
                i--;
                vol++;
            }
            i++;
        }
        return vol==0;
    }
};

0x03.总结

  本题在官方解答的基础上,摒弃了栈,简化了程序结构。

  不过,该算法的时间复杂度和空间复杂度没有改变,均为O(1)。

  相关知识联想:二叉树的前序遍历、中序遍历、后序遍历。

posted @ 2021-03-12 16:34  leuxon  阅读(68)  评论(1)    收藏  举报