🌕🌕 331. 验证二叉树的前序序列化

吞䜛童子2022幎10月10日
  • algorithm
  • Tree
倧纊 2 分钟

🌕🌕 331. 验证二叉树的前序序列化

隟床: 🌕🌕

问题描述

img_11.png


解法 1 - 栈

class Solution {
    public boolean isValidSerialization(String preorder) {
        // 思路
        // 借助 栈
        // 每次遇到 2 䞪连续的 # 诎明该节点是叶子节点匹出 # # cur
        // 匹出后这蟹的子树就是空树了可以甚 # 代替
        // 劂歀埪环䞍断把叶子节点变䞺空节点富臎原有非叶子节点也析析变䞺空节点盎到䞺空树
        String[] arr = preorder.split(",");
        int len = arr.length;
        if(len == 1 && arr[0].equals("#")) {
            // 空树
            return true;
        }
        LinkedList<String> stack = new LinkedList<>();
        // 䟝次压栈
        for(int i = 0; i < len; i ++) {
            String cur = arr[i];
            while(!stack.isEmpty() && stack.peek().equals("#") && cur.equals("#")) {
                // 需芁匹出该叶子节点甚空树代替
                stack.pop();
                // 匹出 2 䞪空节点后需芁保证圓前节点䞺叶子节点即有倌而非又是䞀䞪 #
                if(stack.isEmpty() || stack.peek().equals("#")) {
                    return false;
                }
                stack.pop(); // 匹出有效的叶子节点
            }
            stack.push(cur); // 压入圓前字笊䞲䞍论是 倌 还是 #
        }
        // 由于遍历到最后䞀䞪子䞲无论劂䜕郜压入了最后䞀䞪元玠因歀最终栈䞭只剩䞋最后的䞀䞪元玠而䞔必须是 #
        return stack.size() == 1 && stack.peek().equals("#");
    }
}

蟓出 1

img_10.png


解法 2 - 反序列化思路

class Solution {
    int index = 0;
    int len;
    public boolean isValidSerialization(String preorder) {
        // 思路
        // 题意芁求䞍重建树䜆是我们按照建树的思路看胜吊重建树劂果可以诎明满足条件
        String[] arr = preorder.split(",");
        len = arr.length;
        return mySol(arr) && index >= len; // 芁保证遍历到最后䞀䞪元玠
    }

    private boolean mySol(String[] arr) {
        // System.out.println(index);
        // 递園终止条件
        if(index >= len) {
            return false;
        }
        String cur = arr[index];
        if(cur.equals("#")) {
            // 诎明是空节点指针后移该节点无需重建曎没有巊右子树盎接返回
            index ++;
            return true;
        }
        // 到蟟这里诎明是䞀䞪有倌的节点
        index ++;
        // 递園建立巊右子树
        boolean left = mySol(arr);
        if(!left) {
            return false;
        }
        boolean right = mySol(arr);
        if(!right) {
            return false;
        }
        return true;
    }
}

蟓出

img_12.png

䞊次猖蟑于: 2022/10/10 䞋午8:43:48
莡献者: liuxianzhishou