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

    技术2022-07-10  188

    Leetcode 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

    题解

    用栈实现二叉树的先序遍历。压入1,表示我们需要看这个结点的左子树;压入2,表示我们需要看这个结点的右子树。 我们首先尽可能的往栈中压入1,看它的左子树。如果出现#,我们就需要出栈,若出栈元素为2,表明这个结点我们已经看完了,我们就需要接着出栈;否则,我们就先压一个2,然后再尽可能的往栈中压1,也就是看它的左子树。详细过程见代码

    代码

    bool isValidSerialization(string preorder) { int len = preorder.length(); int i=0; stack<int> tree; if(preorder[i] == '#'){ //看是不是空树 tree.push(2); if(len == 1) return true; else return false; }else{ tree.push(1); } i++; while(!tree.empty() && i<len){ if(preorder[i]==',') i++; else{ if(preorder[i] == '#'){ //进行出栈,若出栈为1,则压入2,开始看它的右子树;否则,则继续判断 int x = tree.top(); tree.pop(); if(x == 1) tree.push(2); else{ while(!tree.empty() && tree.top()==2){ tree.pop(); } if(!tree.empty()){ //不为空,说明栈顶为1,我们需要看这个结点的右子树 tree.pop(); tree.push(2); } } }else{ tree.push(1); //看它的左子树 } while(i<len && preorder[i]!=',') i++; //取结点的值,因为值无关,略去即可 } } if(i<len && preorder[i]==',') i++; return tree.empty() && i == len; }

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    Processed: 0.009, SQL: 9