Verify Preorder Serialization of a Binary Tree
来源:互联网 发布:知乎 科塔萨尔 编辑:程序博客网 时间:2024/05/01 10:21
Problem
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
Solution
class Solution {public: bool isValidSerialization(string preorder) { if(preorder.empty()) return false; if(preorder.size() == 1 && preorder == "#") return true; stack<char> stk; preorder.push_back(','); for( int i = 0; i < preorder.size(); i+=2 ) { if(preorder[i] == '#') { if(stk.empty() ) return false; while( !stk.empty() && stk.top() == '#'){ stk.pop(); if(stk.empty() || stk.top() != '*') return false; stk.pop(); } stk.push('#'); } else { stk.push('*'); int j = preorder.find_first_of(',', i); i = j - 1; } } return stk.size()==1 && stk.top() == '#'; }};
We just need to remember how many empty slots we have during the process.
Initially we have one ( for the root ).
for each node we check if we still have empty slots to put it in.
- a null node occupies one slot.
- a non-null node occupies one slot before he creates two more. the net gain is one.
class Solution(object): def isValidSerialization(self, preorder): """ :type preorder: str :rtype: bool """ # remember how many empty slots we have # non-null nodes occupy one slot but create two new slots # null nodes occupy one slot p = preorder.split(',') #initially we have one empty slot to put the root in it slot = 1 for node in p: # no empty slot to put the current node if slot == 0: return False # a null node? if node == '#': # ocuppy slot slot -= 1 else: # create new slot slot += 1 #we don't allow empty slots at the end return slot==0
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- Verify Preorder Serialization of a Binary Tree
- leetcode Verify Preorder Serialization of a Binary Tree
- 331. Verify Preorder Serialization of a Binary Tree
- Leetcode: Verify Preorder Serialization of a Binary Tree
- LeetCode Verify Preorder Serialization of a Binary Tree
- leetcode 331. Verify Preorder Serialization of a Binary Tree
- [LeetCode]331. Verify Preorder Serialization of a Binary Tree
- 331. Verify Preorder Serialization of a Binary Tree
- [leetcode] Verify Preorder Serialization of a Binary Tree
- Centos7 如何安装中文输入法
- python pip安装模块失败
- Lua中的loadfile、dofile、require详解
- “不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证” 的解决办法
- HTTP 请求
- Verify Preorder Serialization of a Binary Tree
- hdoj 5653 Bomber Man wants to bomb an Array. 【dp】
- BugTags进行bug的管理
- cf25C 增加一条边求最短路 (floyd)
- 单链表的基本操作
- XML(2)
- iOS 中图片旋转的方法
- android修改系统源码之实现蓝牙自动配对以及取消开机锁屏
- HttpClient学习整理