Verify Preorder Serialization of a Binary Tree
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
https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/
要判断给的序列是不是数的先序遍历序列。
思路就是"挖洞",如果第一个是数,那就是根节点,它的左右可以放2个节点,有两个"洞"。
此时如果是‘#‘,填上了一个洞;如果是数,填上一个洞又加了两个洞。
当洞不够用或者最后有没填满的洞,就说明不是先序遍历序列。
1 /** 2 * @param {string} preorder 3 * @return {boolean} 4 */ 5 var isValidSerialization = function(preorder) { 6 var spilted = preorder.split(‘,‘), holes = 0; 7 if(spilted.length === 0) return true; 8 if(spilted[0] !== ‘#‘) holes += 2; 9 for(var i = 1; i < spilted.length; i++){ 10 if(spilted[i] !== ‘#‘){ 11 if(holes > 0) holes++; 12 else return false; 13 }else{ 14 holes--; 15 } 16 if(holes < 0) return false; 17 } 18 return holes === 0 ? true : false; 19 };