• 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("#");
        }
    }
    
  • 相关阅读:
    Python入门--14--字典
    Python入门--13--爬虫一
    Python入门--13--递归
    Python入门--12--函数与变量
    Python入门--11--自定义函数
    Python入门--10--序列
    mysql 删除重复记录
    Java 不可编辑的Map
    mysql left join
    mysql 超过5名学生的课
  • 原文地址:https://www.cnblogs.com/reboot329/p/6112095.html
Copyright © 2020-2023  润新知