[Leetcode][Tree--1]树相关题目汇总/分析/总结--Part1

  1. Binary Tree
    (1) Traversal

    (2) Path

    (3) Verify/Modify

    (4) Depth / Width

    (5) Sum


[Binary Tree][Traversal]

#144 Binary Tree Preorder Traversal

Preorder基础--前序遍历:根左右

  • Sol1 Recursive
    List<Integer> res;
    public List<Integer> preorderTraversal(TreeNode root) {
        res = new ArrayList<>();
        help(root);
        return res;
    }
    public void help(TreeNode root){
        if(root == null) return;
        res.add(root.val);
        help(root.left);
        help(root.right);
    } 
  • Sol2 Iterating
public List<Integer> preorderTraversal(TreeNode root) {
       List<Integer> res = new ArrayList<>();
       Stack<TreeNode> s = new Stack<>();
       while(!s.isEmpty() || root != null){
           while(root != null){
               res.add(root.val);
               s.push(root);
               root = root.left;
           }
           root = s.pop().right;
       }
       return res;
   }
#94 Binary Tree Inorder Traversal

Inorder基础--中序遍历:左根右

  • Sol Recursive
    Time O(n) : T(n) = 2 *T(n/2)+1
    List<Integer> res;
    public List<Integer> inorderTraversal(TreeNode root) {
        res = new ArrayList<>();
        help(root);
        return res;
    }
    public void help(TreeNode root){
        if(root == null) return;
        help(root.left);
        res.add(root.val);
        help(root.right);
    }
  • Sol2 Iterating
    Stack
    Time O(n)
    Space O(n)
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> s = new Stack<>();
        while(!s.isEmpty() || root != null){
            while(root != null){
                s.push(root);
                root = root.left;
            }
            root = s.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }
#145 Binary Tree Postorder Traversal

Postorder基础--后序遍历:左右根

  • Sol1 Recursive
    List<Integer> res;
    public List<Integer> postorderTraversal(TreeNode root) {
        res = new ArrayList<>();
        help(root);
        return res;
    }
    public void help(TreeNode root){
        if(root == null) return;
        help(root.left);
        help(root.right);
        res.add(root.val);
    }
  • Sol2 Iterating
    LinkedList + Stack
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> res = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            if (cur != null) {
                res.addFirst(cur.val);
                stack.push(cur);
                cur = cur.right;

            } else {
                cur = stack.pop();
                cur = cur.left;
            }
        }
        return res;
    }
#102 Binary Tree Level Order Traversal
  • Sol1 Recursive
    List<List<Integer>> res;
    public List<List<Integer>> levelOrder(TreeNode root) {
        res = new ArrayList<>();
        help(root, 1);
        return res;
    }
    public void help(TreeNode root, int level){
        if(root == null) return;
        if(res.size() < level) res.add(new ArrayList<>());
        res.get(level-1).add(root.val);
        help(root.left, level+1);
        help(root.right, level+1);
    }
  • Sol2 Iterating
    Queue
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        TreeNode cur = root;
        q.add(cur);
        while(!q.isEmpty()){
            List<Integer> tmp = new ArrayList<>();
            int n = q.size();
            for(int i = 0; i < n; i++){
                TreeNode l = q.remove();
                tmp.add(l.val);
                if(l.left != null) q.add(l.left);
                if(l.right != null) q.add(l.right);
            }
            res.add(tmp);
        }
        return res;
    }
#107 Binary Tree Level Order Traversal II
  • Sol1 Recursive
    Collections.reverse(res);
    List<List<Integer>> res;
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        res = new ArrayList<>();
        help(root, 1);
        Collections.reverse(res);
        return res;
    }
    public void help(TreeNode root, int level){
        if(root == null) return;
        if(res.size() < level) res.add(new ArrayList<>());
        res.get(level-1).add(root.val);
        help(root.left, level+1);
        help(root.right, level+1);
    }
  • Sol2 Iterating
    res.add(0, tmp);
public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            List<Integer> tmp = new ArrayList<>();
            int n = q.size();
            for(int i = 0; i < n; i++){
                root = q.remove();
                tmp.add(root.val);
                if(root.left!=null)
                    q.offer(root.left);
                if(root.right!=null)
                    q.offer(root.right);
            }
            res.add(0, tmp);
        }
        return res;
    }
#103 Binary Tree Zigzag Level Order Traversal
  • Sol1 Recursive
   List<List<Integer>> res;
   public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
       res = new ArrayList<>();
       help(root, 1);
       boolean reverse = false;
       for(List<Integer> tmp : res){
           if(reverse) Collections.reverse(tmp);
           reverse = !reverse;
       }
       return res;
   }
   public void help(TreeNode root, int level){
       if(root == null) return;
       if(res.size() < level) res.add(new ArrayList<>());
       res.get(level-1).add(root.val);
       help(root.left, level+1);
       help(root.right, level+1);
   }
  • Sol2 Iterating
    Queue
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        boolean reverse = false;
        while(!q.isEmpty()){
            int n = q.size();
            List<Integer> tmp = new ArrayList<>();
            for(int i = 0; i < n; i++){
                TreeNode l = q.remove();
                tmp.add(l.val);
                if(l.left!=null) q.add(l.left);
                if(l.right != null) q.add(l.right);
            }
            if(reverse) Collections.reverse(tmp);
            res.add(tmp);
            reverse = !reverse;
        }
        return res;
    }
#105 Construct Binary Tree from Preorder and Inorder Traversal
  • Sol1 Recursive
int index = 0;
    Map<Integer, Integer> m;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0) return null;
        m = new HashMap<>();
        for(int i = 0; i < inorder.length; i++) m.put(inorder[i], i);
        return build(preorder, inorder, 0, inorder.length-1);
    }
    
    public TreeNode build(int[] pre, int[] in, int i, int j) {
        if(i>j) return null;
        int pivot = m.get(pre[index]);
        TreeNode n = new TreeNode(pre[index]);
        index++;
        n.left = build(pre, in, i, pivot-1);
        n.right = build(pre, in, pivot+1, j);
        return n;
    }
  • Sol2 Iterating
public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0) return null;
        Map<Integer, Integer> m = new HashMap<>();
        for(int i = 0; i < inorder.length; i++) m.put(inorder[i], i);
        Stack<TreeNode> s = new Stack<>();
        TreeNode root = new TreeNode(preorder[0]);
        s.add(root);
        for(int i = 1; i < preorder.length; i++){
            Integer value = preorder[i];
            TreeNode tmp = new TreeNode(value);
            if(m.get(value) < m.get(s.peek().val)) s.peek().left = tmp;
            else {
                TreeNode t = null;
                while(!s.isEmpty() && m.get(value) > m.get(s.peek().val)){
                    t = s.pop();
                }
                t.right = tmp;
            }
            s.add(tmp);
        }
        return root;
    }
#106 Construct Binary Tree from Inorder and Postorder Traversal
  • Sol1 Recursive
    Map<Integer, Integer> m;
    // int index;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = postorder.length;
        if(n == 0) return null;
        m = new HashMap<>();
        for(int i = 0; i < n; i++) m.put(inorder[i], i);
        // index = n-1;
        return build(n-1, postorder, 0, n-1);
    }
    public TreeNode build(int index, int[] postorder, int l, int r){
        if(l > r || index < 0) return null;
        int pivot = m.get(postorder[index]);
        TreeNode n = new TreeNode(postorder[index]);
        // index--;
        n.left = build(index - r + pivot - 1, postorder, l, pivot-1);
        n.right = build(--index, postorder, pivot+1, r);
        return n;
    }
  • Sol2 Iterating
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = postorder.length;
        if(n == 0) return null;
        Map<Integer, Integer> m = new HashMap<>();
        for(int i = 0; i < n; i++) m.put(inorder[i], i);
        Stack<TreeNode> s = new Stack<>();
        TreeNode root = new TreeNode(postorder[n-1]);
        s.add(root);
        for(int i = n-2; i>= 0; i--){
            Integer value = postorder[i];
            TreeNode tmp = new TreeNode(value);
            if(m.get(value) > m.get(s.peek().val)) s.peek().right = tmp;
            else{
                TreeNode parent = null;
                while(!s.isEmpty() && (m.get(value) < m.get(s.peek().val))){
                    parent = s.pop();
                }
                parent.left = tmp;
            }
            s.add(tmp);
        }
        return root;
    }

[Binary Tree][Path]

#124 Binary Tree Maximum Path Sum
  • Sol Recursive
    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        help(root);
        return res;
    }
    public Integer help(TreeNode root) {
        if(root == null) return null;
        Integer left = help(root.left);
        Integer right = help(root.right);
        int tmp = root.val;
        if(left != null){
            tmp = Math.max(tmp, root.val + left);
        }
        if(right != null){
            tmp = Math.max(tmp, root.val + right);
        }
        if(left != null && right != null){
            tmp = Math.max(tmp, root.val + Math.max(right, left));
        }
        if(left != null || right != null) {
            if(left == null) res = Math.max(res, right);
            else if(right == null) res = Math.max(res, left);
            else res = Math.max(res, right + left + root.val);
        }
        res = Math.max(res, tmp);
        return tmp;
    }
#257 Binary Tree Paths
  • Sol1 HashMap + BFS + Stack
    Use HashMap to store the path of current treenode.
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();
        if(root == null) return res;
        String s = "";
        Stack<TreeNode> stack = new Stack<>();
        Map<TreeNode, String> m = new HashMap<>();
        m.put(root, root.val+"");
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            if(cur.left == null && cur.right==null) res.add(m.get(cur));
            if(cur.right != null){
                stack.add(cur.right);
                m.put(cur.right, m.get(cur) + "->" + cur.right.val);
            }
            if(cur.left != null){
                stack.add(cur.left);
                m.put(cur.left, m.get(cur) + "->" + cur.left.val);
            }
        }
        return res;
    }
  • Sol2 Recursive
    public List<String> binaryTreePaths(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }else{
            List<String> left = binaryTreePaths(root.left);
            List<String> right = binaryTreePaths(root.right);
            ArrayList<String> result = new ArrayList<>();
            for (String l : left) {
                result.add(root.val + "->" + l);
            }
            for (String r : right) {
                result.add(root.val + "->" + r);
            }
            if (result.isEmpty()) {
                result.add(root.val + "");
            }
            return result;
        }
    }
List<String> res;
    public List<String> binaryTreePaths(TreeNode root) {
        res = new ArrayList<>();
        help(root, "");
        return res;
    }
    public void help(TreeNode root, String s){
        if(root == null) {
            return;
        }
        if(root.left == null && root.right == null){
            s = s + root.val;
            res.add(s);
            return;
        }
        String tmp = s;
        s = s + root.val + "->";
        help(root.left, s);
        help(root.right, s);
    }
#112 Path Sum
  • Sol Recursive
    public boolean hasPathSum(TreeNode root, int sum) {
        if(root == null) return false;
        if(root.right==null && root.left==null) return root.val == sum;
        return hasPathSum(root.left, sum-root.val) || hasPathSum(root.right, sum-root.val);
    }
#113 Path Sum II
  • Sol Recursive
    Pre Order
    List<List<Integer>> res;
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        res = new ArrayList<>();
        help(root, new ArrayList<>(), sum);
        return res;
    }
    public void help(TreeNode root, List<Integer> tmp, int sum){
        if(root == null) return;
        tmp.add(root.val);
        if(root.left == null && root.right == null){
            if(sum == root.val) res.add(new ArrayList<>(tmp));
        }
        help(root.left, tmp, sum - root.val);
        help(root.right, tmp, sum - root.val);
        tmp.remove(tmp.size()-1);
    }
#437 Path Sum III
  • Sol Recursive
    prefix travers + Backtracking
    public int pathSum(TreeNode root, int sum) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        return help(root, map, sum, 0);
    }
    public int help(TreeNode root, Map<Integer, Integer> map, int sum, int cur){
        if(root == null) return 0;
        cur += root.val;
        int res = map.getOrDefault(cur - sum, 0);
        map.put(cur, map.getOrDefault(cur, 0) + 1);
        res += help(root.left, map, sum, cur) + help(root.right, map, sum, cur);
        map.put(cur, map.get(cur) - 1);
        return res;
    }

[Binary Tree][Verify/Modify]

#110 Balanced Binary Tree
  • Sol Recursive
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;
        return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
    }
    public int depth(TreeNode root){
        if(root == null) return 0;
        return Math.max(depth(root.left), depth(root.right)) + 1;
    }
#226 Invert Binary Tree
  • Sol1 Recursive
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        TreeNode right = invertTree(root.right);
        TreeNode left = invertTree(root.left);
        root.left = right;
        root.right = left;

        return root;
    }
  • Sol2 Iterative
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            TreeNode cur = q.remove();
            TreeNode tmp = cur.left;
            cur.left = cur.right;
            cur.right = tmp;
            if(cur.left!=null) q.add(cur.left);
            if(cur.right!=null) q.add(cur.right);
        }
        return root;
    }
#199 Binary Tree Right Side View
  • Sol1 Iterative
    BFS
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            int n = q.size();
            while(n > 1){
                root = q.remove();
                if(root.left != null) q.add(root.left);
                if(root.right != null) q.add(root.right);
                n--;
            }
            root = q.remove();
            if(root.left != null) q.add(root.left);
            if(root.right != null) q.add(root.right);
            res.add(root.val);
        }
        return res;
    }
  • Sol2 Recursive
    Level order -- BFS
    List<Integer> res;
    public List<Integer> rightSideView(TreeNode root) {
        if(root == null) return new ArrayList<>();
        res = new ArrayList<>();
        help(root, 0);
        return res;
    }
    public void help(TreeNode root, int level){
        if(root == null) return;
        if(res.size() <= level) res.add(root.val);
        help(root.right, level+1);
        help(root.left, level+1);
    }
#114 Flatten Binary Tree to Linked List
  • Sol1 Recursive
    public void flatten(TreeNode root) {
        if(root == null) return;
        TreeNode tmp = root.right;
        TreeNode left = root.left;
        flatten(left);
        root.right = left;
        root.left = null;
        TreeNode cur = root;
        while(cur.right != null){
            cur = cur.right;
        }
        flatten(tmp);
        cur.right = tmp;
    }
#331 Verify Preorder Serialization of a Binary Tree
  • Sol1 Stack
    每个node一定会有两个node,遍历Sring,如果是‘#’则push进stack,如果不是,则pop()两个node
    public boolean isValidSerialization(String preorder) {
        Stack<String> s = new Stack<>();
        String[] str = preorder.split(",");
        for(int i = str.length-1; i>= 0; i--){
            if(!str[i].equals("#")){
                if(s.size() < 2) return false;
                s.pop();
                s.pop();
            }
            s.add(str[i]);
        }
        return s.size() == 1;
    }

[Binary Tree][Depth]

#111 Minimum Depth of Binary Tree
  • Sol 1 Recursive
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        if (root.left == null && root.right == null) return  1;
        if (root.left == null) return minDepth(root.right)+1;
        if (root.right == null) return minDepth(root.left)+1;
        return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
    }
  • Sol2 Iterative
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        int result = 1;
        while(!q.isEmpty()){
            int n = q.size();
            for(int i = 0; i < n; i++){
                root = q.poll();
                if(root.right == null && root.left == null) return result;
                if(root.left!=null) q.offer(root.left);
                if(root.right!=null) q.offer(root.right);
            }
            result++;
        }
        return result;
    }
#104 Maximum Depth of Binary Tree
  • Sol1 Recursive
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 1;
        if(root.left ==null) return maxDepth(root.right) + 1;
        if(root.right == null) return maxDepth(root.left) + 1;
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
  • Iterative
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        int result = 0;
        int depth = 1;
        while(!q.isEmpty()){
            int n = q.size();
            for(int i = 0; i < n; i++){
                root = q.remove();
                if(root.left!=null) q.offer(root.left);
                if(root.right!=null) q.offer(root.right);
                if(root.left == null && root.right == null) result = Math.max(result, depth);
            }
            // result++;
            depth++;
        }
        return result;
    }
#662 Maximum Width of Binary Tree
  • Sol1 BFS
public class Pack {
    TreeNode node;
    int pos;
    Pack(TreeNode node, int pos) {
        this.node = node;
        this.pos = pos;
    }
}
class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        if(root == null) return 0;
        Queue<Pack> q = new LinkedList<>();
        q.offer(new Pack(root, 0));
        int width = 1;
        int left = Integer.MAX_VALUE;
        int right = Integer.MIN_VALUE;
        while(!q.isEmpty()){
            int n = q.size();
            for(int i = 0; i < n; i++){
                Pack tmp = q.poll();
                if(tmp.node.left!=null) {
                    q.offer(new Pack(tmp.node.left, tmp.pos * 2));
                    left = Math.min(left, tmp.pos * 2);
                    right = Math.max(right, tmp.pos * 2);
                }
                if(tmp.node.right!=null) {
                    q.offer(new Pack(tmp.node.right, tmp.pos * 2 + 1));
                    right = Math.max(right, tmp.pos * 2 + 1);
                    left = Math.min(left, tmp.pos * 2 + 1);
                }
            }
            int tmp = 0;
            if(left == Integer.MAX_VALUE || right == Integer.MIN_VALUE) tmp = 1;
            else tmp = right - left + 1;
            width = Math.max(width, tmp);
            left = Integer.MAX_VALUE;
            right = Integer.MIN_VALUE;
        }
        return width;
    }
}

[Binary Tree][Sum]

#404 Sum of Left Leaves
  • Sol1 Recursive
    int res = 0;
    public int sumOfLeftLeaves(TreeNode root) {
        help(root, false);
        return res;
    }
    public void help(TreeNode root, boolean left){
        if(root == null) return;
        if(root.left == null && root.right == null){
            if(left) res += root.val;
            else return;
        }
        help(root.left, true);
        help(root.right, false);
    }
#129 Sum Root to Leaf Numbers
  • Sol1 DFS+BackTracking
    int res = 0;
    public int sumNumbers(TreeNode root) {
        help(root, "");
        return res;
    }
    public void help(TreeNode root, String tmp){
        if(root == null) return;
        tmp = tmp + root.val;
        if(root.left == null && root.right == null) res += Integer.valueOf(tmp);
        help(root.left, tmp);
        help(root.right, tmp);
        tmp = tmp.substring(0, tmp.length()-1);
    }

优化 -- 不用String与int转化

    int res = 0;
    public int sumNumbers(TreeNode root) {
        help(root, 0);
        return res;
    }
    public void help(TreeNode root, int tmp){
        if(root == null) return;
        int cur = tmp * 10 + root.val;
        if(root.left == null && root.right == null) res += cur;
        help(root.left, cur);
        help(root.right, cur);
    }
#563 Binary Tree Tilt

Easy

  • Sol
    int res = 0;
    public int findTilt(TreeNode root) {
        help(root);
        return res;
    }
    public int help(TreeNode root){
        if(root == null) return 0;
        int left = help(root.left);
        int right = help(root.right);
        res += Math.abs(left - right);
        return left + right + root.val;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容