zoukankan      html  css  js  c++  java
  • Verify Preorder Serialization of a Binary Tree -- LeetCode

    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

    思路:将字符串按照逗号分隔,然后依次读入节点。用一个栈来记录当前的节点是左孩子还是右孩子。

     1 class Solution {
     2 public:
     3     bool isValidSerialization(string preorder) {
     4         istringstream iss(preorder);
     5         string node;
     6         stack<bool> leftPathTrack;
     7         bool tracked = false;
     8         while (getline(iss, node, ',')) {
     9             if (tracked && leftPathTrack.empty()) return false;
    10             tracked = true;
    11             if (node == "#") {
    12                 //for the case the root node is '#'
    13                 if (leftPathTrack.empty()) continue;
    14                 /*
    15                 If the current node is left child, pop it and mark the next node as right.
    16                 Else, pop all the nodes in the stack until the top node is a left child,
    17                 pop it and mark the next node as right.
    18                 */
    19                 while (!leftPathTrack.empty() && !leftPathTrack.top()) 
    20                     leftPathTrack.pop();
    21                 if (!leftPathTrack.empty()) {
    22                     leftPathTrack.pop();
    23                     leftPathTrack.push(false);
    24                 }
    25             } else {
    26                 leftPathTrack.push(true);
    27             }
    28         }
    29         return leftPathTrack.empty();
    30     }
    31 };
  • 相关阅读:
    MSSQL 事务说明
    创业课堂之团队
    如何开发HTML编辑器
    IE和Firefox对Documnet,iframe的处理
    jQuery控制iFrame
    如何更高效的制作可通用的HTML页面
    天下武功,无坚不破,唯快不破
    Flash本地通讯
    播放本地MP3 (二)
    播放本地MP3 (一)
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5812847.html
Copyright © 2011-2022 走看看