2021/03/12 每日一题 验证二叉树的前序序列化

LeetCode上验证二叉树的前序序列化,中等难度,记录下解题思路

因为前几题都是用了栈思想来解题,这里也用上栈,方便之后整理

题目给的是已经序列化的二叉树字符串,需要判断这个前序化是否正确,例如"1,#,#,2"就不是一个二叉树

因为已经经过了前序序列化所有的节点是按照根节点-左节点-右节点这个顺序来的,那么如果当一个节点后面两个元素都是#的时候,那么后面就没有元素了


所以这种情况下就能把这个3个节点看为一个#
例如传入"9,3,4,#,#,1,#,#,2,#,6,#,#",画出来的图如下

这样如果按照上面的方法来计算,每次碰见#,#连在一起的情况就将3个元素都设为#,对应到栈的计算是,遍历元素压入栈,如果最后两个元素是#,就要出栈2个元素,并且将出栈后的栈最后一位更改为#
具体流程如下*
当栈S = [9,3,4,#,#]的时候,就移出最后2个#,并且将S[S.length - 1] = #,更改为[9,3,#],如果对应到图中可以视为下图

之后继续遍历当S = [9,3,#,1,#,#]的时候,就移出最后2个#,并且将S[S.length - 1] = #,更改为[9,3,#,#],此时最后两位还是#,还要进行一次操作,最后能够得到的结果是S = [9,#],对应到图上如下图

继续遍历,当S = [9,#,2,#,6,#,#]的时候,最后两位为#,处理后为S = [9,#,2,#,#],最后两位还是#,还要处理,的到S = [9,#,#],并且最后处理为S = [#],对应到图上如下图

最后栈只会剩下一个[#]用来表示有效的

var isValidSerialization = function(preorder) {
    // 拆分字符串为数组,通过','来分隔
    let arr = preorder.split(',')
    // 定义栈
    let stack = []
   // 开始循环数组
    for(let i = 0; i < arr.length; i++) {
        // 入栈
        stack.push(arr[i])
       // 当栈的最后两位为#的开始出栈 
        while(stack[stack.length - 1] == '#' && stack[stack.length - 2] == '#') {
                // 出栈
                stack.pop()
                stack.pop()
               // 将栈的最后一位设为#
                stack[stack.length - 1] = '#'
        }
    }
    // 如果只剩一个元素并且这个元素为#的时候返回true 
    return stack.length == 1 && stack[0] == '#'
};

你可能感兴趣的:(2021/03/12 每日一题 验证二叉树的前序序列化)