331. 验证二叉树的前序序列化
序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #
。
例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#"
,其中 #
代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
保证 每个以逗号分隔的字符或为一个整数或为一个表示 null
指针的 '#'
。
你可以认为输入格式总是有效的
"1,,3"
。注意:不允许重建树。
示例 1:
输入: preorder ="9,3,4,#,#,1,#,#,2,#,6,#,#"
输出:true
示例 2:
输入: preorder ="1,#"
输出:false
示例 3:
输入: preorder ="9,#,#,1"
输出:false
提示:
1 <= preorder.length <= 104
preorder
由以逗号 “,”
分隔的 [0,100]
范围内的整数和 “#”
组成原站题解
rust 解法, 执行用时: 0 ms, 内存消耗: 2.2 MB, 提交时间: 2024-03-31 00:07:53
impl Solution { pub fn is_valid_serialization(preorder: String) -> bool { let mut nodes = 0; let preorder: Vec<&str> = preorder.split_terminator(",").collect(); for i in 0..preorder.len() { if preorder[i] != "#" { nodes += 1; } else { nodes -= 1; } if i < preorder.len() - 1 && nodes < 0 { return false; } } nodes == -1 } }
rust 解法, 执行用时: 0 ms, 内存消耗: 2.1 MB, 提交时间: 2024-03-31 00:07:33
impl Solution { pub fn is_valid_serialization(preorder: String) -> bool { let mut stack = Vec::new(); let preorder: Vec<&str> = preorder.split_terminator(",").collect(); for s in preorder.into_iter() { if s != "#" { stack.push(s); continue; } while !stack.is_empty() && stack[stack.len() - 1] == "#" { stack.pop(); if let Some(x) = stack.pop() { if x == "#" { return false; } } else { return false; } } stack.push("#"); } stack.len() == 1 && stack[0] == "#" } }
golang 解法, 执行用时: 4 ms, 内存消耗: 2 MB, 提交时间: 2023-06-13 09:49:37
func isValidSerialization(preorder string) bool { n := len(preorder) slots := 1 for i := 0; i < n; { if slots == 0 { return false } if preorder[i] == ',' { i++ } else if preorder[i] == '#' { slots-- i++ } else { // 读一个数字 for i < n && preorder[i] != ',' { i++ } slots++ // slots = slots - 1 + 2 } } return slots == 0 }
javascript 解法, 执行用时: 68 ms, 内存消耗: 41.3 MB, 提交时间: 2023-06-13 09:49:23
/** * @param {string} preorder * @return {boolean} */ var isValidSerialization = function(preorder) { const n = preorder.length; let i = 0; let slots = 1; while (i < n) { if (slots === 0) { return false; } if (preorder[i] === ',') { ++i; } else if (preorder[i] === '#') { --slots; ++i; } else { // 读一个数字 while (i < n && preorder[i] !== ',') { ++i; } ++slots; // slots = slots - 1 + 2 } } return slots === 0; };
java 解法, 执行用时: 2 ms, 内存消耗: 39.9 MB, 提交时间: 2023-06-13 09:49:11
class Solution { public boolean isValidSerialization(String preorder) { int n = preorder.length(); int i = 0; int slots = 1; while (i < n) { if (slots == 0) { return false; } if (preorder.charAt(i) == ',') { i++; } else if (preorder.charAt(i) == '#'){ slots--; i++; } else { // 读一个数字 while (i < n && preorder.charAt(i) != ',') { i++; } slots++; // slots = slots - 1 + 2 } } return slots == 0; } }
cpp 解法, 执行用时: 0 ms, 内存消耗: 6.5 MB, 提交时间: 2023-06-13 09:48:58
class Solution { public: bool isValidSerialization(string preorder) { int n = preorder.length(); int i = 0; int slots = 1; while (i < n) { if (slots == 0) { return false; } if (preorder[i] == ',') { i++; } else if (preorder[i] == '#'){ slots--; i++; } else { // 读一个数字 while (i < n && preorder[i] != ',') { i++; } slots++; // slots = slots - 1 + 2 } } return slots == 0; } };
python3 解法, 执行用时: 40 ms, 内存消耗: 16.1 MB, 提交时间: 2023-06-13 09:48:36
# 计算入度出度 class Solution: def isValidSerialization(self, preorder: str) -> bool: nodes = preorder.split(',') diff = 1 for node in nodes: diff -= 1 if diff < 0: return False if node != '#': diff += 2 return diff == 0
python3 解法, 执行用时: 52 ms, 内存消耗: 16 MB, 提交时间: 2023-06-13 09:47:41
class Solution: def isValidSerialization(self, preorder: str) -> bool: stack = list() for i in preorder.split(','): stack.append(i) while len(stack) > 2 and stack[-1] == '#' and stack[-2] == '#' and stack[-3].isdigit(): stack.pop() stack.pop() stack.pop() stack.append('#') return True if stack == ['#'] else False
golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2023-06-13 09:43:54
func isValidSerialization(preorder string) bool { n := len(preorder) stk := []int{1} for i := 0; i < n; { if len(stk) == 0 { return false } if preorder[i] == ',' { i++ } else if preorder[i] == '#' { stk[len(stk)-1]-- if stk[len(stk)-1] == 0 { stk = stk[:len(stk)-1] } i++ } else { // 读一个数字 for i < n && preorder[i] != ',' { i++ } stk[len(stk)-1]-- if stk[len(stk)-1] == 0 { stk = stk[:len(stk)-1] } stk = append(stk, 2) } } return len(stk) == 0 }
javascript 解法, 执行用时: 60 ms, 内存消耗: 41.5 MB, 提交时间: 2023-06-13 09:43:38
/** * @param {string} preorder * @return {boolean} */ var isValidSerialization = function(preorder) { const n = preorder.length; let i = 0; const stack = [1]; while (i < n) { if (!stack.length) { return false; } if (preorder[i] === ',') { ++i; } else if (preorder[i] === '#') { stack[stack.length - 1]--; if (stack[stack.length - 1] === 0) { stack.pop(); } ++i; } else { // 读一个数字 while (i < n && preorder[i] !== ',') { ++i; } stack[stack.length - 1]--; if (stack[stack.length - 1] === 0) { stack.pop(); } stack.push(2); } } return stack.length === 0; };
java 解法, 执行用时: 4 ms, 内存消耗: 40.5 MB, 提交时间: 2023-06-13 09:43:23
class Solution { public boolean isValidSerialization(String preorder) { int n = preorder.length(); int i = 0; Deque<Integer> stack = new LinkedList<Integer>(); stack.push(1); while (i < n) { if (stack.isEmpty()) { return false; } if (preorder.charAt(i) == ',') { i++; } else if (preorder.charAt(i) == '#'){ int top = stack.pop() - 1; if (top > 0) { stack.push(top); } i++; } else { // 读一个数字 while (i < n && preorder.charAt(i) != ',') { i++; } int top = stack.pop() - 1; if (top > 0) { stack.push(top); } stack.push(2); } } return stack.isEmpty(); } }
cpp 解法, 执行用时: 8 ms, 内存消耗: 6.6 MB, 提交时间: 2023-06-13 09:43:07
// 基于栈 class Solution { public: bool isValidSerialization(string preorder) { int n = preorder.length(); int i = 0; stack<int> stk; stk.push(1); while (i < n) { if (stk.empty()) { return false; } if (preorder[i] == ',') { i++; } else if (preorder[i] == '#'){ stk.top() -= 1; if (stk.top() == 0) { stk.pop(); } i++; } else { // 读一个数字 while (i < n && preorder[i] != ',') { i++; } stk.top() -= 1; if (stk.top() == 0) { stk.pop(); } stk.push(2); } } return stk.empty(); } };