91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現二叉樹非遞歸遍歷算法

發布時間:2023-05-05 17:25:36 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C++怎么實現二叉樹非遞歸遍歷算法”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++怎么實現二叉樹非遞歸遍歷算法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、二叉樹的前序遍歷

題目鏈接

我們可以把任何一棵樹看成左路節點,左路節點和右子樹。先訪問左路節點,再訪問左路節點的右子樹。在右子樹中也重復這種循環,就是非遞歸遍歷二叉樹的思想。

C++怎么實現二叉樹非遞歸遍歷算法

解釋:

棧st存放節點,v存放數值,cur初始化為root。

循環條件是棧不為空或者cur不為空(訪問最后一個節點之前棧就已經為空了),循環遍歷左子樹并且把左子樹入棧,同時把值存入v中。然后彈出棧頂元素,并且把棧頂元素的右子樹賦值給cur,這樣就形成了遍歷。

當棧不為空的時候說明還有左路節點的右子樹沒有被訪問,當cur不為空的時候說明還有樹要被訪問。當同時為空的時候才是訪問完成。當一個節點出棧的時候說明此時該節點及該節點的左子樹已經被訪問完成了。

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;
        while(cur || !st.empty())
        {
            while(cur)
            {
                st.push(cur);
                v.push_back(cur->val);
                cur = cur->left;
            }
            TreeNode* node = st.top();
            st.pop();
            cur = node->right;// 轉化成子問題訪問右子樹
        }
        return v;
    }
};

二、二叉樹的中序遍歷

題目鏈接

因為中序遍歷的訪問順序是左根右,跟前序遍歷不同,所以我們讓左節點入棧的時候先不訪問,出棧(說明左子樹訪問完了)時在訪問節點。

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(!st.empty() || cur)
        {
            while(cur)
            {
                st.push(cur);
                cur = cur->left;
            }
            TreeNode* node = st.top();
            st.pop();
            v.push_back(node->val);
            cur = node->right;
        }
        return v;
    }
};

三、二叉樹的后序遍歷

3.1 方法一

首先我們知道后序遍歷就是左右根,而我們可以把訪問順序變成根右左,然后再逆置順序。而根右左就跟前序遍歷的方法一樣:

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;
        while(cur || !st.empty())
        {
            while(cur)
            {
                st.push(cur);
                v.push_back(cur->val);
                cur = cur->right;
            }
            TreeNode* node = st.top();
            st.pop();
            cur = node->left;
        }
        reverse(v.begin(), v.end());
        return v;
    }
};

3.2 方法二

按照常規的遍歷方法走左右根,但是這里有一個問題:

當訪問到根的時候有兩種情況:

1?? 從左子樹回來,現在要先訪問右子樹

2?? 從右子樹回來,左右子樹已經訪問完畢,再訪問根。

針對這種情況我們可以在加一個變量來確定是第幾次訪問根,如果是第一次就訪問右子樹,如果是第二次就訪問。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<pair<TreeNode*, bool>> st;
        vector<int> v;
        TreeNode* cur = root;
        while(cur || !st.empty())
        {
            while(cur)
            {
                st.push(make_pair(cur, false));
                cur = cur->left;
            }
            TreeNode* node = st.top().first;
            if(st.top().second == true)
            {
                st.pop();
                v.push_back(node->val);
            }
            else
            {
                st.top().second = true;
                cur = node->right;
            }
        }
        return v;
    }
};

讀到這里,這篇“C++怎么實現二叉樹非遞歸遍歷算法”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

论坛| 蛟河市| 沙坪坝区| 台江县| 威宁| 盐边县| 饶阳县| 东城区| 和顺县| 克拉玛依市| 大英县| 临武县| 大化| 邵阳县| 新巴尔虎右旗| 山阳县| 桃园县| 玛多县| 准格尔旗| 罗山县| 武陟县| 古丈县| 鄄城县| 乌兰察布市| 莲花县| 山东省| 桃源县| 长垣县| 彭泽县| 广德县| 宜兴市| 内江市| 波密县| 达州市| 宁海县| 庆安县| 综艺| 新丰县| 故城县| 岳阳县| 中西区|