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

C++實(shí)現(xiàn)LeetCode(100.判斷相同樹(shù))

 更新時(shí)間:2021年07月21日 14:50:04   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(100.判斷相同樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 100. Same Tree 判斷相同樹(shù)

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1
    / \       / \
2   3     2   3

        [1,2,3],   [1,2,3]

Output: true

Example 2:

Input:     1         1
/           \
2             2

[1,2],     [1,null,2]

Output: false

Example 3:

Input:     1         1
/ \       / \
2   1     1   2

[1,2,1],   [1,1,2]

Output: false

判斷兩棵樹(shù)是否相同和之前的判斷兩棵樹(shù)是否對(duì)稱都是一樣的原理,利用深度優(yōu)先搜索 DFS 來(lái)遞歸。代碼如下:

解法一:

class Solution {
public:
    bool isSameTree(TreeNode *p, TreeNode *q) {
        if (!p && !q) return true;
        if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
};

這道題還有非遞歸的解法,因?yàn)槎鏄?shù)的四種遍歷(層序,先序,中序,后序)均有各自的迭代和遞歸的寫法,這里我們先來(lái)看先序的迭代寫法,相當(dāng)于同時(shí)遍歷兩個(gè)數(shù),然后每個(gè)節(jié)點(diǎn)都進(jìn)行比較,可參見(jiàn)之間那道 Binary Tree Preorder Traversal,參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        stack<TreeNode*> st;
        st.push(p); st.push(q);
        while (!st.empty()) {
            p = st.top(); st.pop();
            q = st.top(); st.pop();
            if (!p && !q) continue;
            if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
            st.push(p->right); st.push(q->right);
            st.push(p->left); st.push(q->left);
        }
        return true;
    }
};

也可以使用中序遍歷的迭代寫法,對(duì)應(yīng)之前那道 Binary Tree Inorder Traversal,參見(jiàn)代碼如下:

解法三:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        stack<TreeNode*> st;
        while (p || q || !st.empty()) {
            while (p || q) {
                if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
                st.push(p); st.push(q);
                p = p->left; q = q->left;
            }
            p = st.top(); st.pop();
            q = st.top(); st.pop();
            p = p->right; q = q->right;
        }
        return true;
    }
};

對(duì)于后序遍歷的迭代寫法,貌似無(wú)法只是用一個(gè)棧來(lái)做,因?yàn)槊看稳〕鰲m斣睾蟛涣ⅠR移除,這樣使用一個(gè)棧的話兩棵樹(shù)結(jié)點(diǎn)的位置關(guān)系就會(huì)錯(cuò)亂,分別使用各自的棧就好了,對(duì)應(yīng)之前那道 Binary Tree Postorder Traversal,參見(jiàn)代碼如下:

解法四:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        stack<TreeNode*> st1, st2;
        TreeNode *head1, *head2;
        while (p || q || !st1.empty() || !st2.empty()) {
            while (p || q) {
                if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
                st1.push(p); st2.push(q);
                p = p->left; q = q->left;
            }
            p = st1.top(); 
            q = st2.top(); 
            if ((!p->right || p->right == head1) && (!q->right || q->right == head2)) {
                st1.pop(); st2.pop();
                head1 = p; head2 = q;
                p = nullptr; q = nullptr;
            } else {
                p = p->right;
                q = q->right;
            }
        }
        return true;
    }
};

對(duì)于層序遍歷的迭代寫法,其實(shí)跟先序遍歷的迭代寫法非常的類似,只不過(guò)把棧換成了隊(duì)列,對(duì)應(yīng)之前那道 Binary Tree Level Order Traversal,參見(jiàn)代碼如下:

解法五:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        queue<TreeNode*> que;
        que.push(p); que.push(q);
        while (!que.empty()) {
            p = que.front(); que.pop();
            q = que.front(); que.pop();
            if (!p && !q) continue;
            if ((p && !q) || (!p && q) || (p->val != q->val)) return false;
            que.push(p->right); que.push(q->right);
            que.push(p->left); que.push(q->left);
        }
        return true;
    }
};

Github 同步地址:

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

類似題目:

Binary Tree Preorder Traversal

Binary Tree Inorder Traversal

Binary Tree Postorder Traversal

Binary Tree Level Order Traversal

參考資料:

https://leetcode.com/problems/same-tree/

https://leetcode.com/problems/same-tree/discuss/32684/My-non-recursive-method

https://leetcode.com/problems/same-tree/discuss/32687/Five-line-Java-solution-with-recursion

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(100.判斷相同樹(shù))的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)判斷相同樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    這篇文章主要給大家介紹了關(guān)于C++中如何實(shí)現(xiàn)回調(diào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 對(duì)for循環(huán)中表達(dá)式和循環(huán)體的執(zhí)行順序詳解

    對(duì)for循環(huán)中表達(dá)式和循環(huán)體的執(zhí)行順序詳解

    今天小編就為大家分享一篇對(duì)for循環(huán)中表達(dá)式和循環(huán)體的執(zhí)行順序詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 詳解如何使用C++寫一個(gè)線程安全的單例模式

    詳解如何使用C++寫一個(gè)線程安全的單例模式

    這篇文章主要為大家詳細(xì)介紹了如何使用C++寫一個(gè)線程安全的單例模式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2022-10-10
  • C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解

    C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解

    這篇文章主要介紹了C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java 出現(xiàn)NullPointerException的原因及解決辦法

    java 出現(xiàn)NullPointerException的原因及解決辦法

    這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關(guān)資料,這里說(shuō)明出現(xiàn)NullPointerException 的原因的總結(jié),并說(shuō)明該如何解決,需要的朋友可以參考下
    2017-08-08
  • Qt各種字符轉(zhuǎn)換的實(shí)現(xiàn)示例

    Qt各種字符轉(zhuǎn)換的實(shí)現(xiàn)示例

    本文主要介紹了Qt各種字符轉(zhuǎn)換的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++ 超全面講解多態(tài)

    C++ 超全面講解多態(tài)

    這篇文章主要介紹了C++多態(tài)的原理與實(shí)現(xiàn),多態(tài)是一種面向?qū)ο蟮脑O(shè)計(jì)思路,本身和C++不是強(qiáng)綁定的,其他語(yǔ)言當(dāng)中一樣有多態(tài),只不過(guò)實(shí)現(xiàn)的方式可能有所不同。下面來(lái)一起了解更多詳細(xì)內(nèi)容吧
    2022-04-04
  • 詳解QML?調(diào)用?C++?中的內(nèi)容

    詳解QML?調(diào)用?C++?中的內(nèi)容

    這篇文章主要介紹了QML?怎么調(diào)用?C++?中的內(nèi)容,這里主要是總結(jié)一下,怎么在 QML 文件中引用 C ++ 文件里定義的內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法

    C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法

    這篇文章主要介紹了C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法,非常實(shí)用的經(jīng)典算法,需要的朋友可以參考下
    2014-08-08
  • 使用QT連接USB攝像頭的方法

    使用QT連接USB攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了使用QT連接USB攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論

家居| 运城市| 扶风县| 汪清县| 石景山区| 云阳县| 都昌县| 麻江县| 石家庄市| 东方市| 定南县| 平凉市| 黑龙江省| 海兴县| 新泰市| 当涂县| 平谷区| 通海县| 浮山县| 巴彦县| 九江县| 石柱| 汽车| 澄江县| 黔东| 凯里市| 淮安市| 海口市| 陆丰市| 岐山县| 济源市| 义马市| 陵水| 成武县| 婺源县| 抚松县| 泸水县| 拜城县| 中山市| 宁德市| 阿克苏市|