• 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 };
  • 相关阅读:
    IE8及其以下浏览器边框圆角兼容问题
    关于git的一些指令及遇到的问题和解决方法
    vue项目环境搭建及运行
    webpack中的重要功能
    webpack 的重要功能
    c++ stl sort 自定义排序函数cmp要遵循 strict weak ordering
    spring boot 包jar运行
    windows上传文件到linux云服务器上
    最少硬币数目的问题
    leetcode 415 两个字符串相加
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5812847.html
Copyright © 2020-2023  润新知