代碼隨想錄算法訓(xùn)練營打卡Day15 | LeetCode二叉樹的層序遍歷相關(guān)題目廓块、LeetCode226 翻轉(zhuǎn)二叉樹、LeetCode101 對(duì)稱二叉樹

摘要

  • 二叉樹的遞歸遍歷對(duì)應(yīng)著DFS买决,二叉樹的層序遍歷對(duì)應(yīng)著BFS
  • 層序遍歷的迭代法實(shí)現(xiàn)一般用隊(duì)列進(jìn)行實(shí)現(xiàn)

LeetCode102 二叉樹的層序遍歷

102. 二叉樹的層序遍歷 - 力扣(Leetcode)

  • 這和教材上的層序遍歷有所不同沛婴,題目要求我們區(qū)分樹每一層吼畏。
  • 樹的第k層的節(jié)點(diǎn)數(shù)最多為2^{k-1}個(gè),不過層序遍歷并不是遍歷完全二叉樹嘁灯,所以每層的個(gè)數(shù)應(yīng)該由我們手動(dòng)控制泻蚊。
  • 實(shí)現(xiàn)思路:
    • size記錄當(dāng)前層的節(jié)點(diǎn)個(gè)數(shù),每從隊(duì)列中彈出一個(gè)當(dāng)前層的節(jié)點(diǎn)丑婿,size就減一性雄,當(dāng)size為零時(shí),當(dāng)前層遍歷完成羹奉。

初見題目時(shí)完整的題解代碼如下

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (!root) {
            return res;
        }
        queue<TreeNode*> que;
        que.push(root);
        int size = que.size();
        int level = 0;
        res.push_back({});
        while (!que.empty()) {
            if (que.front()) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                res[level].push_back(que.front()->val);
            }
            que.pop();
            size--;
            if (size == 0 && !que.empty()) {
                size = que.size();
                level++;
                res.push_back({});
            }
        }
        return res;
    }
};
  • 看了講解之后秒旋,以上的方法雖然邏輯是對(duì)的,但是由于每次循環(huán)只處理一個(gè)節(jié)點(diǎn)诀拭,多了很多不必要的size個(gè)數(shù)的判斷迁筛,所以還可以改良。

  • 可以在循環(huán)內(nèi)添加一個(gè)for循環(huán)耕挨,每次循環(huán)直接遍歷完一層

完整的題解代碼如下

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) {
            que.push(root);
        }

        vector<vector<int>> res;
        while (!que.empty()) {
            int size = que.size();
            vector<int> level;
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                level.push_back(que.front()->val);
                que.pop();
            }
            res.push_back(level);
        }

        return res;
    }
};

LeetCode107 二叉樹的層序遍歷II

107. 二叉樹的層序遍歷 II - 力扣(Leetcode)

  • 將上一題的答案數(shù)組反轉(zhuǎn)即可
  • 有DFS的方法细卧,日后補(bǔ)充

完整的題解代碼如下

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) {
            que.push(root);
        }
        
        vector<vector<int>> res;
        while (!que.empty()) {
            int size = que.size();
            vector<int> level;
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                level.push_back(que.front()->val);
                que.pop();
            }
            res.push_back(level);
        }

        reverse(res.begin(), res.end());
        return res;
    }
};

LeetCode199 二叉樹的右視圖

199. 二叉樹的右視圖 - 力扣(Leetcode)

  • 取每層的最后一個(gè)節(jié)點(diǎn)的值放入答案數(shù)組

完整的題解代碼如下

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) {
            que.push(root);
        }

        vector<int> res;
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                if (i == size - 1) res.push_back(que.front()->val);
                que.pop();
            }
        }

        return res;
    }
};

LeetCode637 二叉樹的層平均值

637. 二叉樹的層平均值 - 力扣(Leetcode)

完整題解代碼如下

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) que.push(root);

        vector<double> res;
        while (!que.empty()) {
            int size = que.size();
            double average = 0;
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                average += que.front()->val;
                que.pop();
            }
            average /= size;
            res.push_back(average);
        }
        
        return res;
    }
};

LeetCode429 N叉樹的層序遍歷

429. N 叉樹的層序遍歷 - 力扣(Leetcode)

  • 只需要修改每層遍歷的邏輯,將添加左孩子和右孩子進(jìn)隊(duì)列擴(kuò)展為添加N個(gè)孩子進(jìn)隊(duì)列

N叉樹的節(jié)點(diǎn)定義

class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};

完整題解代碼如下

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*> que;
        if (root) que.push(root);

        vector<vector<int>> res;
        while (!que.empty()) {
            int size = que.size();
            vector<int> level;
            for (int i = 0; i < size; i++) {
                for (auto& iter : que.front()->children) {
                    if (iter) que.push(iter);
                }
                level.push_back(que.front()->val);
                que.pop();
            }
            res.push_back(level);
        }

        return res;
    }
};

LeetCode515 在每個(gè)樹行中找最大值

515. 在每個(gè)樹行中找最大值 - 力扣(Leetcode)

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) que.push(root);

        vector<int> res;
        while (!que.empty()) {
            int size = que.size();
            int maxVal = INT_MIN;
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                maxVal = maxVal > que.front()->val ? maxVal : que.front()->val; 
                que.pop();
            }
            res.push_back(maxVal);
        }
        
        return res;
    }
};

LeetCode116 填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針

116. 填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針 - 力扣(Leetcode)

完整題解代碼如下

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> que;
        if (root) que.push(root);

        while (!que.empty()) {
            int size = que.size();
            for (int i = 0;i < size; i++) {
                Node* cur = que.front();
                que.pop();
                // 每層的最后一個(gè)節(jié)點(diǎn)的next為nullptr
                Node* next = i == size - 1 ? nullptr : que.front();
                cur->next = next;
                if (cur->left) que.push(cur->left);
                if (cur->right) que.push(cur->right);
            }
        }

        return root;
    }
};

LeetCode117 填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針

117. 填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針 II - 力扣(Leetcode)

  • 由于116的題解其實(shí)已經(jīng)考慮了非完全二叉樹的情況筒占,所以題解代碼相同
class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> que;
        if (root) que.push(root);

        while (!que.empty()) {
            int size = que.size();
            for (int i = 0;i < size; i++) {
                Node* cur = que.front();
                que.pop();
                // 每層的最后一個(gè)節(jié)點(diǎn)的next為nullptr
                Node* next = i == size - 1 ? nullptr : que.front();
                cur->next = next;
                if (cur->left) que.push(cur->left);
                if (cur->right) que.push(cur->right);
            }
        }

        return root;
    }
};

LeetCode104 二叉樹的最大深度

104. 二叉樹的最大深度 - 力扣(Leetcode)

完整題解代碼如下

class Solution {
public:
    int maxDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) que.push(root);

        int res = 0;
        while (!que.empty()) {
            int size = que.size();
            res++;
            for (int i = 0; i < size; i++) {
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                que.pop();
            }
        }

        return res;
    }
};

LeetCode111 二叉樹的最小深度

111. 二叉樹的最小深度 - 力扣(Leetcode)

  • 根據(jù)最小深度的定義贪庙,當(dāng)遍歷到一個(gè)左右孩子都為空的節(jié)點(diǎn)時(shí),即可直接返回當(dāng)前節(jié)點(diǎn)所在的層數(shù)
class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if (root) que.push(root);
        
        int res = 0;
        while (!que.empty()) {
            int size = que.size();
            res++;
            for (int i = 0; i < size; i++) {
                if (!que.front()->left && !que.front()->right) {
                    return res;
                }
                if (que.front()->left) que.push(que.front()->left);
                if (que.front()->right) que.push(que.front()->right);
                que.pop();
            }
            
        }

        return res;
    }
};

LeetCode226 翻轉(zhuǎn)二叉樹

226. 翻轉(zhuǎn)二叉樹 - 力扣(Leetcode)

  • 怎么理解翻轉(zhuǎn)翰苫?翻轉(zhuǎn)后的二叉樹與原來的二叉樹是鏡面對(duì)稱的止邮,實(shí)際上就是交換每個(gè)節(jié)點(diǎn)的左孩子和右孩子。

  • image.png
  • 二叉樹的遍歷中奏窑,有前序导披、中序、后序良哲、層序四種方式盛卡,都能訪問到二叉樹的所有節(jié)點(diǎn)助隧。選擇哪一種呢筑凫?

  • 在這道題目里,只有中序是不太合適的并村,或者說邏輯上會(huì)有陷阱巍实。先看前序遍歷,代碼如下

遞歸法哩牍,前序遍歷

class Solution {
public:
    void invertTreeWorkPlace(TreeNode* cur) {
        if (cur == nullptr) {
            return;
        }
        swap(cur->left, cur->right);
        invertTreeWorkPlace(cur->left);
        invertTreeWorkPlace(cur->right);
    }
    TreeNode* invertTree(TreeNode* root) {
        invertTreeWorkPlace(root);
        return root;
    }
};

那中序遍歷是不是把swap(cur->left, cur->right)下移一行就可以了呢棚潦?

class Solution {
public:
    void invertTreeWorkPlace(TreeNode* cur) {
        if (cur == nullptr) {
            return;
        }
        invertTreeWorkPlace(cur->left);
        swap(cur->left, cur->right); // 這合理嗎?
        invertTreeWorkPlace(cur->right);
    }
    TreeNode* invertTree(TreeNode* root) {
        invertTreeWorkPlace(root);
        return root;
    }
};

我們自己模擬一次遞歸的過程就知道問題出在哪了

  • 以LeetCode的示例1為例膝昆,一直遞歸調(diào)用直到節(jié)點(diǎn)1丸边,
image.png
  • 節(jié)點(diǎn)一為葉節(jié)點(diǎn)叠必,所以invertTreeWorkPlace(cur->left)直接返回;swap(cur->left, cur->right)實(shí)踐上交換了兩個(gè)nullptr妹窖;invertTreeWorkPlace(cur->right)也直接返回
  • 返回到節(jié)點(diǎn)2纬朝,節(jié)點(diǎn)2執(zhí)行swap(cur->left, cur->right)
image.png
  • 然后再執(zhí)行invertTreeWorkPlace(cur->right),問題就來了骄呼,這時(shí)候的右子樹是原來的左子樹共苛,實(shí)際上按這樣的代碼我們一直都在操作原來的二叉樹的左子樹。這就是中序遍歷在操作節(jié)點(diǎn)時(shí)的邏輯陷阱蜓萄。

一定要用中序遍歷的話隅茎,就要注意此時(shí)要操作原來右子樹就是要操作交換后的左子樹。

class Solution {
public:
    void invertTreeWorkPlace(TreeNode* cur) {
        if (cur == nullptr) {
            return;
        }
        invertTreeWorkPlace(cur->left);
        swap(cur->left, cur->right);
        invertTreeWorkPlace(cur->left);
    }
    TreeNode* invertTree(TreeNode* root) {
        invertTreeWorkPlace(root);
        return root;
    }
};

統(tǒng)一形式的迭代法實(shí)現(xiàn)嫉沽,用函數(shù)指針提高代碼復(fù)用

class Solution {
public:
    static void preorder(TreeNode* cur, stack<TreeNode*>& st) {
        st.pop();
        if (cur->right) st.push(cur->right);
        if (cur->left) st.push(cur->left);
        st.push(cur);
        st.push(nullptr);
    }
    static void swapLeftAndRight(TreeNode* cur) {
        swap(cur->left, cur->right);
    }
    void treeTraversal(TreeNode* root, 
                        void (*traversal)(TreeNode* cur, stack<TreeNode*>& st),
                        void (*handle)(TreeNode* cur))
    {
        stack<TreeNode*> st;
        if (root) st.push(root);
        while (!st.empty()) {
            TreeNode* cur = st.top();
            if (cur) {
                traversal(cur, st);
            }
            else {
                st.pop();
                cur = st.top();
                st.pop();
                handle(cur);
            }
        }
    }
    TreeNode* invertTree(TreeNode* root) {
        treeTraversal(root, preorder, swapLeftAndRight);
        return root;
    }
};

LeetCode101 對(duì)稱二叉樹

101. 對(duì)稱二叉樹 - 力扣(Leetcode)

  • 這道題和 LeetCode226 類似辟犀,不過這里我們要做的是比較根節(jié)點(diǎn)的左右子樹是否鏡面對(duì)稱,所以要同時(shí)訪問兩棵樹耻蛇。
  • 要先判斷當(dāng)前節(jié)點(diǎn)的左右子樹是否鏡面對(duì)稱踪蹬,所以采用后序遍歷的“左右中”,訪問完左右子樹后才能確定當(dāng)前節(jié)點(diǎn)是否為一個(gè)對(duì)稱二叉樹的根節(jié)點(diǎn)臣咖。
  • 先采用遞歸法實(shí)現(xiàn):
    • 確定遞歸函數(shù)的參數(shù)和返回值:要比較左右子樹是否鏡面對(duì)稱跃捣,所以需要傳入左子樹和右子樹的根節(jié)點(diǎn);比較結(jié)果有對(duì)稱和不對(duì)稱兩種夺蛇,為布爾值疚漆,所以返回類型為布爾值。
    • 確定遞歸的終止條件
      1. 左子樹為空刁赦,右子樹不為空娶聘;自然是不對(duì)稱的,返回false
      2. 左子樹不為空甚脉,右子樹為空丸升;同1
      3. 左右子樹都為空,說明這是一個(gè)葉節(jié)點(diǎn)牺氨,左右子樹都為空自然對(duì)稱狡耻,返回true
    • 確定單層遞歸的邏輯:通過布爾運(yùn)算實(shí)現(xiàn),首先判斷左子樹的左子樹是否和右子樹的右子樹相等猴凹;再判斷左子樹的右子樹是否和右子樹的左子樹相等夷狰;最后再判斷當(dāng)前節(jié)點(diǎn)的左孩子是否和右孩子相等。

遞歸法實(shí)現(xiàn)的完整代碼

class Solution {
public:
    bool isSymmetricWorkPlace(TreeNode* left, TreeNode* right) {
        if (!left && right) return false;
        if (left && !right) return false;
        if (!left && !right) return true;
        bool res = true;
        res = res && isSymmetricWorkPlace(left->left, right->right);
        res = res && isSymmetricWorkPlace(left->right, right->left);
        res = res && left->val == right->val;
        return res;
    }
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;
        return isSymmetricWorkPlace(root->left, root->right);
    }
};
  • 另外可以通過迭代法來判斷樹的每層是否鏡面對(duì)稱郊霎,但要記得每層的nullptr也要進(jìn)入隊(duì)列來在層序中區(qū)分左孩子和右孩子
  • 注意沼头,每次比較的不是某個(gè)節(jié)點(diǎn)的左孩子和右孩子,而是某層的最左未被比較的節(jié)點(diǎn)和最右未被比較的節(jié)點(diǎn)。

以LeetCode的示例1為例

  • 首先比較隊(duì)列頭和隊(duì)列尾进倍,此時(shí)的隊(duì)列[2, 2]
image.png
  • 然后隊(duì)列頭和隊(duì)列尾都出隊(duì)土至。按鏡面對(duì)稱讓隊(duì)列頭的左孩子、右孩子和隊(duì)列尾的左孩子猾昆、孩子入隊(duì)毙籽,此時(shí)的隊(duì)列[3, 4, 4, 3]
image.png
  • 繼續(xù)上述步驟,隊(duì)列頭和隊(duì)列尾出隊(duì)毡庆,二者左右孩子按鏡面對(duì)稱入隊(duì)
    • 此時(shí)隊(duì)列[nullptr, nullptr, 4, 4, nullptr, nullptr]
  • 循環(huán)直至隊(duì)列為空坑赡,注意這不是層序遍歷,并不是比較完一層再到下一層么抗。

采用雙端隊(duì)列迭代法來實(shí)現(xiàn)判斷二叉樹是否對(duì)稱

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root) {
            deque<TreeNode*> deq;
            deq.push_front(root->left);
            deq.push_back(root->right);
            while (!deq.empty()) {
                TreeNode* left = deq.front();
                deq.pop_front();
                TreeNode* right = deq.back();
                deq.pop_back();
                // 左右子樹都為空自然是對(duì)稱的
                if (!left && !right) {
                    continue;
                }
                // 這里是短路判斷毅否,只有要比較的左右兩個(gè)節(jié)點(diǎn)都不為空才會(huì)比較值,防止操作空指針
                if (!left || !right || (left->val != right->val)) {
                    return false;
                }
                // 用雙端隊(duì)列更加直觀的體現(xiàn)出對(duì)稱蝇刀,其實(shí)也可以用普通隊(duì)列實(shí)現(xiàn)
                deq.push_front(left->right);
                deq.push_front(left->left);
                deq.push_back(right->left);
                deq.push_back(right->right);
            }
        }
        return true;
    }
};
  • 那用真正的層序遍歷是否可以做這道題呢螟加?當(dāng)然是可以的,同樣也要注意往每層的序列中加入nullptr來區(qū)分左孩子和右孩子吞琐。
  • 但是層序遍歷有一個(gè)問題捆探,就是我們要遍歷完這一層后才能判斷當(dāng)前層是否鏡面對(duì)稱,相當(dāng)于要多花一倍的時(shí)間站粟。為了便于對(duì)比黍图,在這里還是給出用層序遍歷的實(shí)現(xiàn)代碼。

層序遍歷的實(shí)現(xiàn)代碼

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        bool res = true;
        if (!root) return res;
        queue<TreeNode*> que;
        if (root) que.push(root);

        while (!que.empty()) {
            int size = que.size();
            vector<TreeNode*> level;
            for (int i = 0; i < size; i++) {
                if (que.front()) {
                    que.push(que.front()->left);
                    que.push(que.front()->right);
                }
                level.push_back(que.front());
                que.pop();
            }
            if (level.size() > 1 && level.size() % 2) return false;
            for (int i = 0, j = level.size() - 1; i < j; i++, j--) {
                if (!level[i] && !level[j]) continue;
                if (!level[i] || !level[j] || level[i]->val != level[j]->val) {
                    return false;
                }
            }
        }

        return res;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奴烙,一起剝皮案震驚了整個(gè)濱河市助被,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌切诀,老刑警劉巖揩环,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幅虑,居然都是意外死亡丰滑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門倒庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褒墨,“玉大人,你說我怎么就攤上這事哄芜∶餐ぃ” “怎么了柬唯?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵认臊,是天一觀的道長。 經(jīng)常有香客問我锄奢,道長失晴,這世上最難降的妖魔是什么剧腻? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮涂屁,結(jié)果婚禮上书在,老公的妹妹穿的比我還像新娘。我一直安慰自己拆又,他們只是感情好儒旬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帖族,像睡著了一般栈源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竖般,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天甚垦,我揣著相機(jī)與錄音,去河邊找鬼涣雕。 笑死艰亮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挣郭。 我是一名探鬼主播迄埃,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兑障!你這毒婦竟也來了调俘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤旺垒,失蹤者是張志新(化名)和其女友劉穎彩库,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先蒋,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骇钦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竞漾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯搭。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖业岁,靈堂內(nèi)的尸體忽然破棺而出鳞仙,到底是詐尸還是另有隱情,我是刑警寧澤笔时,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布棍好,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏借笙。R本人自食惡果不足惜扒怖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望业稼。 院中可真熱鬧盗痒,春花似錦、人聲如沸低散。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熔号。三九已至看成,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨嘉,已是汗流浹背川慌。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祠乃,地道東北人梦重。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像亮瓷,于是被迫代替她去往敵國和親琴拧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容