LeetCode 331-Verify Preorder Serialization of a Binary Tree

分析

  • 设置一个栈,栈内的元素有两个状态。
  • true状态表示两个孩子均未出现,false表示已经出现过1个孩子。
  • 当第i个元素到来时,先判断栈顶元素,为true则置换成false,否则栈顶元素退栈,如当前第i个元素为数字,true入栈。
  • 循环过程中如果出现栈为空的状态说明不构成binary tree。

注意

  • 几个特例。
    • 树根为null,返回true。
    • 有多个元素但头结点为null,返回false。
  • preorder字符串需要预处理。
class Solution {
public:
    bool isValidSerialization(string preorder) {
        vector<string> ss = preprocess(preorder);
        if (ss.empty()) return false;
        if (ss.size() == 1 && ss[0] == "#") return true;
        if (ss.size() > 1 && ss[0] == "#") return false;
        stack<bool> st;
        st.push(true);
        for (int i = 1; i < ss.size(); ++i) {
            if (st.empty()) return false;
            bool top = st.top();
            st.pop();
            if (top) {
                st.push(false);
            }
            if (ss[i] != "#") {
                st.push(true);
            }
        }
        return st.empty();
    }
    
    vector<string> preprocess(string s) {
        int b = 0;
        vector<string> ret;
        for (int i = 0; i < s.length(); ++i) {
            if (s[i] == ',') {
                ret.push_back(s.substr(b, i - b));
                b = i + 1;
            }
        }
        ret.push_back(s.substr(b, s.length() - b));
        return ret;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原题 先序遍历是序列化二叉树的方式之一。当遇到非空节点时,记录节点的值。如果是空节点,我们将其记为#。 例如,题目...
    Jason_Yuan阅读 342评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,771评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,951评论 19 139
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 10,992评论 0 11
  • 图/文 燕之素言 传说中的后沟古村,古老沧桑,一幅黄土地上的历史画卷。 雕刻精细的古戏台,保留完整的古庙宇,设计科...
    燕之素言阅读 347评论 0 2