leetcode_middle_70_331. Verify Preorder Serialization of a Binary Tree

题意:

给定一个叶子节点只能是#,且#只能是叶子节点的二叉树的前序遍历序列,判断是否符合上述规则。


分析:

因为不能重构这棵树,判断是否合乎规则,这是栈的重要应用。

比如:

                6

          #      3

               #   #

对于6来说3下面怎样不重要,3的下面必然是两个#,这很好办,但也可能像6一样,下面只有一个#

我们只需将3及其子树变为#放回栈中,作为6的叶子结点即可:

                 6

             #    #

处理即可

我们分析发现,只要连续两个#就把他俩连带前一个数字消掉,用#代替即可。


这个思路本来不敢完全确定,用例子在纸上走一遍之后发现可行,实现之后发现代码居然和讨论区一个仁兄一模一样哈哈。

public class Solution {
    public boolean isValidSerialization(String preorder) {
        Stack<String> s = new Stack<String>();
        String[] cs = preorder.split(",");
        for(int i=0; i<cs.length; i++){
            String c = cs[i];
            while(!s.isEmpty() && s.peek().equals("#") && c.equals("#")){
                s.pop();
                if(s.isEmpty())
                    return false;
                s.pop();
            }
            s.push(c);
        }
        return s.size()==1 && s.peek().equals("#");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值