331. 验证二叉树的前序序列化

文章介绍了两种方法来验证给定的字符串序列是否可以通过有效的操作(如添加和替换#字符)转换为只包含一个#的序列。方法一是逐个检查,方法二是合并连续的#。
摘要由CSDN通过智能技术生成

题目

方法一:
满足以下两点才是有效的
1.遍历一遍字符串,#的次数=数字的次数+1
2.在遍历过程中,#的次数一定<=数字次数

class Solution {
public:
    vector<string> ans;
    void func(string s){
        s+=',';
        string cur="";
        for(auto i:s){
            if(i!=',') cur+=i;
            else{
                ans.push_back(cur);
                cur="";
            }
        }
    }
    bool isValidSerialization(string preorder) {
        int c1=0,c2=0;
        func(preorder);
        for(int i=0;i<ans.size();i++){
            if(ans[i]=="#") c1+=1;
            else c2+=1;
            if(c1>c2 && i!=ans.size()-1return false;
        }
        return c1==c2+1;
    }
};

方法二:如果在数字后面是连续两个 ‘#’,那么就将这三个元素替换成一个 ‘#’,这个过程一直持续到数组遍历结束。
最后,判断数组长度是否为 1,且数组唯一的元素是否为 ‘#’ 即可。

class Solution {
public:
    vector<string> ans;
    void func(string s){
        s+=',';
        string cur="";
        for(auto i:s){
            if(i!=',') cur+=i;
            else{
                ans.push_back(cur);
                cur="";
            }
        }
    }
    bool isValidSerialization(string preorder) {
        vector<string> st;
        func(preorder);
        for(auto i:ans){
            st.push_back(i);
            while(st.size()>2 && st[st.size()-1]=="#" && st[st.size()-2]=="#"&& st[st.size()-3]!="#"){
                st.pop_back();
                st.pop_back();
                st.pop_back();
                st.push_back("#");
            }
        }
        return st.size()==1 && st[0]=="#";
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值