「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」 331. 验证二叉树的前序序列化
题目
不重要,请看思路
栈
思路:枚举所有字符,将字符压入栈中,遇到栈中有两个连续#,弹出两个#和栈中最后一位数;知道结束;栈中只有一个字符,且字符为#即为正确二叉树前序序列化
看图是不是很清晰,根据上图编辑代码如下:
var isValidSerialization = function (preorder) {
const array = preorder.split(',')
const len = array.length;
const stack = []
for (let i = 0; i < len; i++) {
stack.push(array[i])
while(stack.length >=3 && stack[stack.length-1] === stack[stack.length-2] && stack[stack.length-1] === '#' && stack[stack.length-3] !== '#'){
stack.pop();
stack.pop();
stack.pop();
stack.push('#')
}
}
return stack.length === 1 && stack.pop() === '#'
}
出度入度法
观察下图的入度出度;
入度:指向节点的数量
出度:节点指向的数量
观察上图可以得到
1、无论什么节点,入度都是1;
2、非#节点出度都是2,#节点出度为0;
3、完整二叉树 出度数量 === 入度数量
根据上面观察到的数据和结论编辑代码如下
var isValidSerialization = function (preorder) {
const array = preorder.split(',')
const len = array.length
let diff = 1
for (let i = 0; i < len; i++) {
diff -= 1
if (diff < 0) return false
if (array[i] !== '#') {
diff += 2
}
}
return diff === 0
}