我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
331. 验证二叉树的前序序列化
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。
思路:
我们从题意分析,从根节点开始遍历,首先没有遍历之前,初始化根节点需要一个槽点来放置根元素。
遍历9,这个槽点有真实节点放置了,则槽位减一个,增加2个槽位即给左右两个子节点的留出空位。如果遍历到# 则说明遍历到了空节点,槽位减一个,不再增加,因为空节点不会有节点作为它的子节点。
下面我们看一下动画,更清楚了解槽位的变化:
了解完在遍历工程中槽位的变化情况,以及最终如何确定二叉树前序序列化的,那我们开始写代码吧:
var isValidSerialization = function(preorder) {
// 边界情况判定
const n = preorder.length;
let slots = 1,i =0
while(i< n){
if(slots == 0)return false; //如果等于0了直接返回false
if(preorder[i] == '#') {
i++
slots--
}else if(preorder[i] == ','){
i++
}else {
//数字情况 遍历到数字我们会增加两个子节点的槽位同时减掉一个自己占有的槽位 即只增加了一个槽位
// 这里的循环是判断如`2, 96 ,#,`两位及两位以上的数字 这里只做索引递增,等循环遍历完毕之后,槽位加1,遍历结束条件碰到`,`。
while(i < n && preorder[i] != ','){
i++
}
slots +=1
}
}
return slots == 0
};
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~