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 };