• leetcode 331. Verify Preorder Serialization of a Binary Tree


    传送门

    331. Verify Preorder Serialization of a Binary Tree

       My Submissions
    Total Accepted: 10790 Total Submissions: 34071 Difficulty: Medium

    One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as #.

         _9_
        /   
       3     2
      /    / 
     4   1  #  6
    /  /    / 
    # # # #   # #
    

    For example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node.

    Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.

    Each comma separated value in the string must be either an integer or a character '#' representing null pointer.

    You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3".

    Example 1:
    "9,3,4,#,#,1,#,#,2,#,6,#,#"
    Return true

    Example 2:
    "1,#"
    Return false

    Example 3:
    "9,#,#,1"
    Return false

     
    题意:
    判断给的字符串 是不是一个合法的 前序遍历
     
    思路:
    用栈,如果 一个节点的 左子树 和 右子树 都 true 的话,该节点 向上返回true
     
    false的情况:
    1. 某个节点已经 左子树 和 右子树 都遍历过了,后续又 涉及到该节点的儿子(如 1,#,#,#)
    2. 根节点是 已经 访问结束,后续还有其它节点 (#,1  或 1,#,#,1)
     
    150 / 150 test cases passed.
    Status: 

    Accepted

    Runtime: 8 ms
     
     
     1 class Solution {
     2 public:
     3     bool isValidSerialization(string preorder) {
     4         int l = preorder.length();
     5         if(preorder[0] == '#'){
     6             if(l == 1) return true;
     7             else return false;
     8         }
     9         int i = 0;
    10         stack<int> s;
    11         s.push(0);
    12         while(i<l && preorder[i] != ',') i++;
    13         i++;
    14         int te;
    15         while(i < l)
    16         {
    17             if(preorder[i] == '#'){
    18                 if(s.empty() == 1) return false;
    19                 while(!s.empty())
    20                 {
    21                     te = s.top();
    22                     if(te == 2) return false;
    23                     s.pop();
    24                     s.push(te + 1);
    25                     te = s.top();
    26                     if(te == 1){
    27                         break;
    28                     }
    29                     if(te == 2 ){
    30                         s.pop();
    31                     }
    32                 }
    33                 if(s.empty() == 1 && i < l - 1) return false;
    34             }
    35             else{
    36                 s.push(0);
    37             }
    38             while(i < l && preorder[i] != ',') i++;
    39             i++;
    40         }
    41         if(s.size() == 0) return true;
    42         return false;
    43     }
    44 };
  • 相关阅读:
    JQuery MultiSelect(左右选择框)
    jquery隐藏table表格的某一列
    JS刷新页面的几种方法
    jQuery对select操作小结
    更新数据前jquery如何填充数据到表单域中
    hibernate中load和get方法的区别
    java项目常用 BaseDao BaseService
    js判断360浏览器 兼容模式IE版本
    vue 文本比较插件
    vue问题总结
  • 原文地址:https://www.cnblogs.com/njczy2010/p/5449690.html
Copyright © 2020-2023  润新知