列表

详情


331. 验证二叉树的前序序列化

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#'

你可以认为输入格式总是有效的

注意:不允许重建树。

 

示例 1:

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true

示例 2:

输入: preorder = "1,#"
输出: false

示例 3:

输入: preorder = "9,#,#,1"
输出: false

 

提示:

原站题解

去查看

class Solution {
public:
bool isValidSerialization(string preorder) {
}
};
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

上一题