2022/11/12 算法练习 力扣331:验证二叉树的前序化序列

1、题目描述

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

 

2022/11/12 算法练习 力扣331:验证二叉树的前序化序列_第1张图片

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。

你可以认为输入格式总是有效的

  • 例如它永远不会包含两个连续的逗号,比如 "1,,3" 。

提示:

  • 1 <= preorder.length <= 104
  • preorder 由以逗号 “,” 分隔的 [0,100] 范围内的整数和 “#” 组成

注意:不允许重建树

示例 1:

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"输出:true

示例 2:

输入: preorder = "1,#"输出: false

示例 3:

输入: preorder = "9,#,#,1"输出: false

2、分析

(1)num--;

          除了根节点之外,其他的结点都被当作叶子结点多计算了一次,要首先减掉

(2)if(num<-1) return false; 

          如果num已经小于-1了,就可以说明‘#’一定多了,return false;

          因为最后n2 - n0=-1; 既然小于-1,则可以说明n0变大,也就是叶子节点多了

(3)num = num + 2;

         把叶子结点加上;

还有另外的使用栈的做法,是遍历到两个‘#’的时候,就把这两个‘#’的父节点变为‘#’,表明这已经是一棵正确的子树。一直重复到最后。

2022/11/12 算法练习 力扣331:验证二叉树的前序化序列_第2张图片

 

3、完整代码

class Solution {
    public boolean isValidSerialization(String preorder) {
       //默认每个结点有两个子节点,即除叶子节点外,其他的都是度为2的子节点
       //n2 = n0 - 1 --> n2 - n0 = -1;
       //既是叶子结点全为#,其余结点全部为度为2的结点
       //先处理preorder
       int num = 0;    
       String[] s = preorder.split(",");
       for(int i = 0; i

你可能感兴趣的:(算法练习,算法,leetcode,数据结构,回归算法,java)