簡單粗暴,代碼有待優化,不過自己獨立完成,沒有參考任何材料,還是比較滿意的
package y2019.Algorithm.stack.medium; import java.util.Stack; /** * @Auther: xiaof * @Date: 2019/12/6 09:06 * @Description:331. 驗證二叉樹的前序序列化 * * 序列化二叉樹的一種方法是使用前序遍歷。當我們遇到一個非空節點時,我們可以記錄下這個節點的值。如果它是一個空節點, * 我們可以使用一個標記值記錄,例如 #。 * * _9_ * / \ * 3 2 * / \ / \ * 4 1 # 6 * / \ / \ / \ * # # # # # # * 例如,上面的二叉樹可以被序列化爲字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一個空節點。 * 給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫一個在不重構樹的條件下的可行算法。 * 每個以逗號分隔的字符或爲一個整數或爲一個表示 null 指針的 '#' 。 * 你可以認爲輸入格式總是有效的,例如它永遠不會包含兩個連續的逗號,比如 "1,,3" 。 * * 示例 1: * 輸入: "9,3,4,#,#,1,#,#,2,#,6,#,#" * 輸出: true * 示例 2: * 輸入: "1,#" * 輸出: false * 示例 3: * 輸入: "9,#,#,1" * 輸出: false * * 來源:力扣(LeetCode) * 鏈接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree * 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。 * */ public class IsValidSerialization { /** * 執行用時 : 10 ms , 在所有 java 提交中擊敗了 43.30% 的用戶 * 內存消耗 : 35.5 MB , 在所有 java 提交中擊敗了 97.06% 的用戶 * @param preorder * @return * by xiaof 2019年12月6日10:09:08 */ public boolean solution(String preorder) { if ("#".equals(preorder)) { return true; } String[] eles = preorder.split(","); boolean isRight = false; //默認就是左節點,如果是右節點是#,那麼就出棧,如果是左節點是#,那麼就切換左右 Stack<String> stack = new Stack(); //如果棧爲空的時候,還有最後一個#,那麼正好跳出循環 int index = 0; String curEle = eles[0]; stack.push(eles[index]); //開始遍歷後續元素 for (index = 1; index < eles.length; ++index) { if ("#".equals(curEle) && isRight) { return false; } if ("#".equals(eles[index])) { isRight = true; if (stack.isEmpty()) { //如果棧已經空了 break; } curEle = stack.pop(); } else { stack.push(eles[index]); isRight = false; } } return stack.isEmpty() && index == (eles.length - 1); } public static void main(String[] args) { String s = "9,3,4,#,#,1,#,#,2,#,6,#,#"; String s1 = "1,#"; String s2 = "1"; String s3 = "#"; String s4 = "#,#"; IsValidSerialization fuc = new IsValidSerialization(); fuc.solution(s4); } }