331. Verify Preorder Serialization of a Binary Tree

二刷

2种做法,indegree outdegree是一种。

public class Solution {
    public boolean isValidSerialization(String preorder) 
    {
        if(preorder.length() == 0) return true;
        
        String[] noodArray = preorder.split(",");
        
        int indegree = 0;
        int outdegree = 1;
        
        for(int i = 0; i < noodArray.length;i++)
        {
            if(outdegree - indegree < 1) return false;
            char tempChar = noodArray[i].charAt(0);
            if(tempChar == '#') indegree++;
            else
            {
                outdegree+=2;
                indegree++;
            }
            
             
        }
        if(indegree == outdegree) return true;
        else return false;
    }
}

具体是判断能不能再添加了。
标准是outdegree - indegree > 0

OUT算是可用的,IN是用掉的,只要还有可用的,就可以继续添加。

然后最后out == in才行。

初始自动给个out =1 in = 0,给的那个1是为了添加ROOT的。

另一个方法是Stack。

因为是preOrder,所以push到stack过程中,如果数量多余3个,就有潜在的可以剪枝的机会,剪枝机会的表现是:
stack顶端的3个是

数字

说明这个子树是符合规定的,那么把这个子树直接变成1个#,然后push回去。

只在多余3的情况考虑。

最终STACK里剩下1个#就说明符合了。很新颖的思路,具体实现方法,一刷里有。



三刷。

记忆力不行,这个题记得是in/out degree来做的,这么做也确实方便。

没添加一个NODE会增加1个in-Degree,如果添加的不是null会增加2个out-Degree.

out-Degree > in-Degree说明有多余的out-Degree等待添加Node,所以可以继续添加。

注意初始是outDegree - inDgree = 1. 相当于初始给个支来添加Root..

然后添加的时候要先判断,再添加。。最后in-Degree == out-Degree才行。

public class Solution {
    public boolean isValidSerialization(String preorder) {
        if (preorder.length() == 0) return true;
        int inDegree = 0;
        int outDegree = 1;
        
        for (String s : preorder.split(",")) {
            inDegree ++;
            if (outDegree - inDegree < 0) return false;
            if (!s.equals("#")) outDegree += 2;
        }
        
        return inDegree == outDegree;
    }
}

看二刷说第二个做法是preOrder,这样当栈顶是2个# #的时候,说明可以剪掉这个分支,这里的剪掉不是backtrack,是cut,cut your balls的cut。

挖槽,做了好久,里面的逻辑有点混乱。。

public class Solution {
    public boolean isValidSerialization(String preorder) {
        if (preorder.length() == 0) return true;
        Stack<String> stk = new Stack<>();
        String[] str = preorder.split(",");
        
        for (int i = 0; i < str.length; i++) {
            String s = str[i];
            stk.push(s);
            while (stk.size() >= 3 && s.equals("#")) {
                String s1 = stk.pop();
                String s2 = stk.pop();
                String s3 = stk.pop();
                if (s2.equals("#") && !s3.equals("#")) {
                    stk.push("#");
                } else if (s2.equals("#") && s3.equals("#")) {
                    return false;
                } else {
                    stk.push(s3);
                    stk.push(s2);
                    stk.push(s1);
                    break;
                }
            }
        }
        return stk.size() == 1 && stk.peek().equals("#");
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/6112095.html