最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針)

 更新時(shí)間:2021年07月23日 16:07:36   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 116. Populating Next Right Pointers in Each Node 每個(gè)節(jié)點(diǎn)的右向指針

You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Example:

Input: {"$id":"1","left":{"$id":"2","left":"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}

Output: {"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}

Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B.

Note:

  • You may only use constant extra space.
  • Recursive approach is fine, implicit stack space does not count as extra space for this problem.

這道題實(shí)際上是樹的層序遍歷的應(yīng)用,可以參考之前的博客 Binary Tree Level Order Traversal,既然是遍歷,就有遞歸和非遞歸兩種方法,最好兩種方法都要掌握,都要會寫。下面先來看遞歸的解法,由于是完全二叉樹,所以若節(jié)點(diǎn)的左子結(jié)點(diǎn)存在的話,其右子節(jié)點(diǎn)必定存在,所以左子結(jié)點(diǎn)的 next 指針可以直接指向其右子節(jié)點(diǎn),對于其右子節(jié)點(diǎn)的處理方法是,判斷其父節(jié)點(diǎn)的 next 是否為空,若不為空,則指向其 next 指針指向的節(jié)點(diǎn)的左子結(jié)點(diǎn),若為空則指向 NULL,代碼如下:

解法一:

class Solution {
public:
    Node* connect(Node* root) {
        if (!root) return NULL;
        if (root->left) root->left->next = root->right;
        if (root->right) root->right->next = root->next? root->next->left : NULL;
        connect(root->left);
        connect(root->right);
        return root;
    }
};

對于非遞歸的解法要稍微復(fù)雜一點(diǎn),但也不算特別復(fù)雜,需要用到 queue 來輔助,由于是層序遍歷,每層的節(jié)點(diǎn)都按順序加入 queue 中,而每當(dāng)從 queue 中取出一個(gè)元素時(shí),將其 next 指針指向 queue 中下一個(gè)節(jié)點(diǎn)即可,對于每層的開頭元素開始遍歷之前,先統(tǒng)計(jì)一下該層的總個(gè)數(shù),用個(gè) for 循環(huán),這樣當(dāng) for 循環(huán)結(jié)束的時(shí)候,該層就已經(jīng)被遍歷完了,參見代碼如下:

解法二:

// Non-recursion, more than constant space
class Solution {
public:
    Node* connect(Node* root) {
        if (!root) return NULL;
        queue<Node*> q;
        q.push(root);
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                Node *t = q.front(); q.pop();
                if (i < size - 1) {
                    t->next = q.front();
                }
                if (t->left) q.push(t->left);
                if (t->right) q.push(t->right);
            }
        }
        return root;
    }
};

我們再來看下面這種碉堡了的方法,用兩個(gè)指針 start 和 cur,其中 start 標(biāo)記每一層的起始節(jié)點(diǎn),cur 用來遍歷該層的節(jié)點(diǎn),設(shè)計(jì)思路之巧妙,不得不服?。?/p>

解法三:

// Non-recursion, constant space
class Solution {
public:
    Node* connect(Node* root) {
        if (!root) return NULL;
        Node *start = root, *cur = NULL;
        while (start->left) {
            cur = start;
            while (cur) {
                cur->left->next = cur->right;
                if (cur->next) cur->right->next = cur->next->left;
                cur = cur->next;
            }
            start = start->left;
        }
        return root;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/116

類似題目:

Populating Next Right Pointers in Each Node II

Binary Tree Right Side View

參考資料:

https://leetcode.com/problems/populating-next-right-pointers-in-each-node/

https://leetcode.com/problems/populating-next-right-pointers-in-each-node/discuss/37473/My-recursive-solution(Java)

https://leetcode.com/problems/populating-next-right-pointers-in-each-node/discuss/37472/A-simple-accepted-solution

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)每個(gè)節(jié)點(diǎn)的右向指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言如何讀取bmp圖像

    C語言如何讀取bmp圖像

    這篇文章主要介紹了C語言如何讀取bmp圖像,BMP即bitmap,由文件頭信息塊、圖像描述信息塊、顏色表、圖像數(shù)據(jù)區(qū)四部分組成,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • C++詳解PIMPL指向?qū)崿F(xiàn)的指針

    C++詳解PIMPL指向?qū)崿F(xiàn)的指針

    PIMPL 是 C++ 中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類中,并用一個(gè)指針進(jìn)行訪問
    2022-07-07
  • C++虛函數(shù)表深入研究

    C++虛函數(shù)表深入研究

    這篇文章主要介紹了C++的虛函數(shù)表,內(nèi)容非常詳細(xì),思路清晰,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • C++實(shí)現(xiàn)LeetCode(17.電話號碼的字母組合)

    C++實(shí)現(xiàn)LeetCode(17.電話號碼的字母組合)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(17.電話號碼的字母組合),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中的覆蓋和隱藏詳解

    C++中的覆蓋和隱藏詳解

    這篇文章主要介紹了C++中重載、重寫(覆蓋)和隱藏的區(qū)別,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-08-08
  • C語言光標(biāo)旋轉(zhuǎn)與倒計(jì)時(shí)功能實(shí)現(xiàn)示例詳解

    C語言光標(biāo)旋轉(zhuǎn)與倒計(jì)時(shí)功能實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)光標(biāo)旋轉(zhuǎn)與倒計(jì)時(shí)功能的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • C++ ReSharper2021激活碼永久有效

    C++ ReSharper2021激活碼永久有效

    ReSharperC++是為c/c++開發(fā)者打造的一款實(shí)用Visual Studio擴(kuò)展插件,這款插件旨在提升開發(fā)者的效率,今天給大家分享這款軟件的激活方法,需要C++ ReSharper2021激活碼的朋友參考下本文
    2021-06-06
  • C/C++中I/O進(jìn)階詳解及其作用介紹

    C/C++中I/O進(jìn)階詳解及其作用介紹

    這篇文章主要介紹了C/C++中I/O進(jìn)階詳解及其作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++標(biāo)準(zhǔn)模版庫(STL)之vector容器詳解

    C++標(biāo)準(zhǔn)模版庫(STL)之vector容器詳解

    vector的功能和水桶一樣,就是用來裝東西的,并且vector還提供了迭代器來很方便的訪問這些數(shù)據(jù),下面就讓我們一起看下如何使用C++的vector吧
    2023-03-03
  • C語言時(shí)間處理實(shí)例分享

    C語言時(shí)間處理實(shí)例分享

    這篇文章主要介紹了C語言時(shí)間處理實(shí)例分享的相關(guān)資料,需要的朋友可以參考下
    2015-07-07

最新評論

开封县| 华池县| 福鼎市| 宁河县| 宁化县| 枣阳市| 鹤岗市| 河间市| 金阳县| 钟祥市| 塔河县| 昌吉市| 襄城县| 张掖市| 安西县| 东阳市| 古蔺县| 太和县| 会泽县| 古交市| 龙口市| 图木舒克市| 揭西县| 临城县| 图们市| 保靖县| 道真| 牙克石市| 曲靖市| 焉耆| 禹城市| 饶平县| 临潭县| 肃宁县| 法库县| 舒兰市| 江源县| 精河县| 蕉岭县| 句容市| 清原|