题目:
给定一棵二叉树的前序遍历序列,如 "9,3,4,#,#,1,#,#,2,#,6,#,#" ,# 代表空节点,判断是否是一个正确的二叉树前序遍历序列
提供两种解题思路,出度&入度, 栈
1. 出度& 入度
/*
这道题使用出度和入度来解决,对于以下节点来说:
非空节点: 出度 2, 入度 1
空节点: 出度 0, 入度 1
那么当我们建立一棵二叉树的时候,出度和入度之差 diff = 出度 - 入度
对于加入任何一个节点,diff - 1, 因为整体的树为它减少了一个入度。
当加入一个非空节点的时候,diff + 2, 因为它提供了两个出度。
那么当树是正确的时候,diff的值应该为非负。如果为正确的树的时候,
diff == 0
*/
public boolean isValidSerialization(String preorder) {
String[] nodes = preorder.split(",");
int diff = 1;
for (int i = 0; i < nodes.length; ++i) {
//先减入度,再加出度
if (--diff < 0) {
return false;
}
if (!"#".equals(nodes[i])) {
diff += 2;
}
}
return diff == 0;
}
2. 栈
/*
已例子一为例,:”9,3,4,#,#,1,#,#,2,#,6,#,#” 遇到x # #的时候,就把它变为 #
模拟一遍过程:
9,3,4,#,# => 9,3,# 继续读
9,3,#,1,#,# => 9,3,#,# => 9,# 继续读
9,#2,#,6,#,# => 9,#,2,#,# => 9,#,# => #
栈中最后一个元素为 # 的时候结果一定是true
*/
public boolean isValidSerialization(String preorder) {
String[] nodes = preorder.split(",");
ArrayList<String> stack = new ArrayList<String>();
for (int i = 0; i < nodes.length; ++i) {
stack.add(nodes[i]);
while (stack.size() >= 3
&& stack.get(stack.size() - 1 ).equals("#")
&& stack.get(stack.size() - 2 ).equals("#")
&& !stack.get(stack.size() - 3 ).equals("#")) {
stack.remove(stack.size() - 1);
stack.remove(stack.size() - 1);
stack.remove(stack.size() - 1);
stack.add("#");
}
}
if( stack.size() == 1 && stack.get(0).equals("#"))
return true;
else
return false;
}
--------------EOF---------------