思路一:
利用棧模擬前序遍歷的相反過程,且每個前序序列最後必定爲“#”
class Solution {
public boolean isValidSerialization(String preorder) {
String[] str = preorder.split(",");
Stack<String>stk = new Stack<String> () ;
for(int i=0;i<str.length;i++){
if(str[i].charAt(0)>='0'&&str[i].charAt(0)<='9'){
stk.push(str[i]);
}else if(str[i].charAt(0)=='#'){
if(stk.empty()&&i==str.length-1){
return true;
}
if(stk.empty()&&i!=str.length-1){
return false;
}
if(!stk.empty()&&stk.peek().charAt(0)>='0'&&stk.peek().charAt(0)<='9'){
stk.pop();
}
}
}
if(!stk.empty()){
return false;
}
return false;
}
}
思路二:
和思路一比較相似,也是用棧實現,兩個#和一個數字合成爲一個#
class Solution {
public boolean isValidSerialization(String preorder) {
String[] str = preorder.split(",");
Stack<String>stk = new Stack<String> () ;
int count =0;
for(int i=str.length-1;i>=0;i--){
if(str[i].charAt(0)=='#'){
stk.push(str[i]);
count+=1;
}else if(str[i].charAt(0)>='0'&&str[i].charAt(0)<='9'){
if(count>=2){
stk.pop();
count-=1;
}else{
return false;
}
}
}
if(stk.peek().charAt(0)=='#'&&stk.size()==1){
return true;
}else{
return false;
}
}
}
思路三:
根據圖的特性,出度=入度,設度爲diff ,則經過一個節點,diff-1,若節點不是#,節點加2,且過程中不能有節點的diff小於0,最終的結果也爲0,初始diff爲1(由於根節點的入度爲0,出度爲2,設爲1,則減一加二恰好爲2)
class Solution {
public boolean isValidSerialization(String preorder) {
int diff = 1;
String[] pre = preorder.split(",");
for(int i=0;i<pre.length;i++){
diff--;
if(diff<0){
return false;
}
if(pre[i].charAt(0)>='0'&&pre[i].charAt(0)<='9'){
diff+=2;
//ystem.out.println(diff);
}
}
if(diff==0){
return true;
}else{
return false;
}
}
}
思路四:
一個完整的二叉樹一定由三部分組成,根,左子樹,右子樹,可以先尋找完整的左子樹,若沒找到則序列不正確,若找到再尋找右子樹,未找到則不正確,最後長度應該等於序列長度。
class Solution {
public int findtree(String[]str,int start){
if(str.length-start==0){//若未找到完整的左子樹,start會一直增加,直到返回-1
return -1;
}
if(str[start].charAt(0)=='#'){
return start+1;
}
int left = findtree(str,start+1);
if(left<0){
return -1;
}
int right = findtree(str,left);
if(right<0){
return -1;
}
return right;
}
public boolean isValidSerialization(String preorder) {
String[] str = preorder.split(",");
if(findtree(str,0)==str.length){
return true;
}
return false;
}
}