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

432 阅读1分钟

题目介绍

力扣331题:leetcode-cn.com/problems/ve…

image.png

image.png

分析

利用二叉树的出度跟入度相等的条件进行判断。 image.png

如果存在一条有向边 A --> B,则这条边给 A 增加了 1 个出度,给 B 增加了 1 个入度。

image.png

二叉树本来就是图,看成有向图,一条有向边带来一个入度和一个出度,二叉树的总入度等于总出度,也等于边数。即,遍历到最后,总入度肯定等于总出度

遍历过程中(null 也看作节点):

  • 根节点提供 2 个出度
  • 根节点以外的真实节点,提供 2 个出度, 1 个入度
  • null 节点提供 1 个入度

还没遍历到最后时?肯定不会出现 入度 >= 出度 的时刻。为什么?

  • 看图1,提供 1 个出度可以理解为提供一个挂载点,提供 1 个入度为消耗一个挂载点

  • 入度 >= 出度,意味着当前已遍历的节点,消耗的挂载点已经大于等于提供的挂载点

  • 说明已经没法挂载接下来遍历的节点了,还有要挂的,但挂满了,是不合法的。

遍历一个二叉树(null 也看作节点),遍历过的分支,肯定还没挂满,不然走不到下一个节点,当走到最后一个节点时,正好都挂满了。

代码如下:

class Solution {
    public boolean isValidSerialization(String preorder) {
        //首先根据英文逗号进行分割
        String[] dataArr=preorder.split(",");
        List<String> dataList= Arrays.asList(dataArr);
        return  preOrder(dataList);
    }

    public boolean preOrder(List<String> dataList) { 
        //out出度,in入度
        int out=0,in=-1;
        for(int i = 0;i < dataList.size();i++){
            //入度为1
            in++;
            //出现了入度大于出度的情况,直接返回false
            if(out < in) {
                return false;
            }
            if(!dataList.get(i).equals("#")) {
                //出度为2
                out+=2;
            }
        }
        return out == in;
    }
}