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 := 1for 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 = 1for node in nodes:diff -= 1if diff < 0:return Falseif node != '#':diff += 2return 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();}};