题目介绍
力扣331题:leetcode-cn.com/problems/ve…
分析
利用二叉树的出度跟入度相等的条件进行判断。
如果存在一条有向边 A --> B,则这条边给 A 增加了 1 个出度,给 B 增加了 1 个入度。
二叉树本来就是图,看成有向图,一条有向边带来一个入度和一个出度,二叉树的总入度等于总出度,也等于边数。即,遍历到最后,总入度肯定等于总出度
遍历过程中(null 也看作节点):
- 根节点提供 2 个出度
- 根节点以外的真实节点,提供 2 个出度, 1 个入度
- null 节点提供 1 个入度
还没遍历到最后时?肯定不会出现 入度 >= 出度 的时刻。为什么?
-
看图1,提供 1 个出度可以理解为提供一个挂载点,提供 1 个入度为消耗一个挂载点
-
入度 >= 出度,意味着当前已遍历的节点,消耗的挂载点已经大于等于提供的挂载点
-
说明已经没法挂载接下来遍历的节点了,还有要挂的,但挂满了,是不合法的。
遍历一个二叉树(null 也看作节点),遍历过的分支,肯定还没挂满,不然走不到下一个节点,当走到最后一个节点时,正好都挂满了。
代码如下:
class Solution {
public boolean isValidSerialization(String preorder) {
//首先根据英文逗号进行分割
String[] dataArr=preorder.split(",");
List<String> dataList= Arrays.asList(dataArr);
return preOrder(dataList);
}
public boolean preOrder(List<String> dataList) {
//out出度,in入度
int out=0,in=-1;
for(int i = 0;i < dataList.size();i++){
//入度为1
in++;
//出现了入度大于出度的情况,直接返回false
if(out < in) {
return false;
}
if(!dataList.get(i).equals("#")) {
//出度为2
out+=2;
}
}
return out == in;
}
}