LeetCode:Verify Preorder Serialization of a Binary Tree
Posted walker lee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Verify Preorder Serialization of a Binary Tree相关的知识,希望对你有一定的参考价值。
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
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
思路一:
1.使用“栈”从左到右扫描数据;
2.当遇到数字字符,直接进栈;
3.当遇到“#”字符:
1)如果“栈”顶不是“#”,直接入栈;
2)如果“栈”顶也是“#”,连续再次出栈,循环直到“栈”顶非“#”;
3)“#”字符进栈。
4.最后,当stack中只剩一个“#”字符时,返回true,否则false。
java code:
public class Solution { public boolean isValidSerialization(String preorder) { Stack<String> stack = new Stack<>(); String[] str = preorder.split(","); for(String s : str) { while(s.equals("#") && !stack.isEmpty() && stack.peek().equals("#")) { stack.pop(); if(stack.empty()) return false; stack.pop(); } stack.push(s); } return stack.size() == 1 && stack.peek().equals("#"); } }
思路二:
计算树的“入度”与“出度”。
设diff = 出度-入度 = outdegree - indegree;
1.当遇到“数字”indegree + 1,outdegree + 2(相当于diff+1),即每个非叶子结点有1个入度和2个出度;
2.当遇到“#”时,indegree + 1(相当于diffe-1);
3.最后,当diff时返回true,否则false。
c++ code:
class Solution { public: bool isValidSerialization(string preorder) { int diff = 1; for(int i = 0;i < preorder.size(); i++) { if(preorder[i] == ',') continue; while('0' <= preorder[i] && preorder[i] <= '9') i++; if(--diff < 0) return false; if(preorder[i] != '#') diff += 2; } return diff == 0; } };
以上是关于LeetCode:Verify Preorder Serialization of a Binary Tree的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode: Verify Preorder Serialization of a Binary Tree
LeetCode:Verify Preorder Serialization of a Binary Tree
LeetCode:Verify Preorder Serialization of a Binary Tree
[LeetCode] Verify Preorder Serialization of a Binary Tree
[LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化
105. Construct Binary Tree from Preorder and Inorder Traversal