【LEETCODE】71、驗證二叉樹的前序序列化

簡單粗暴,代碼有待優化,不過自己獨立完成,沒有參考任何材料,還是比較滿意的

 

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);

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章