国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ 非遞歸實現二叉樹的前中后序遍歷

C++ 非遞歸實現二叉樹的前中后序遍歷

2022-03-02 14:432021dragon C/C++

本文將結合動畫和代碼演示如何通過C++ 非遞歸實現二叉樹的前中后序的遍歷,代碼具有一定的價值,感興趣的同學可以學習一下

二叉樹的前序遍歷

C++ 非遞歸實現二叉樹的前中后序遍歷

在不使用遞歸的方式遍歷二叉樹時,我們可以使用一個棧模擬遞歸的機制。二叉樹的前序遍歷順序是:根 → 左子樹 → 右子樹,我們可以先將二叉樹的左路結點入棧,在入棧的同時便對其進行訪問,此時就相當于完成了根和左子樹的訪問,當左路結點入棧完畢后再從棧頂依次取出結點,并用同樣的方式訪問其右子樹即可。

具體步驟如下:

  1. 將左路結點入棧,入棧的同時訪問左路結點。
  2. 取出棧頂結點top。
  3. 準備訪問top結點的右子樹。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
    //前序遍歷
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st; //輔助棧
        vector<int> ret; //用于存放前序遍歷的結果
        TreeNode* cur = root;
        while (cur || !st.empty())
        {
            //1、將左路結點入棧,入棧的同時訪問左路結點
            while (cur)
            {
                st.push(cur);
                ret.push_back(cur->val);
                cur = cur->left;
            }
            //2、取出棧頂結點
            TreeNode* top = st.top();
            st.pop();
            //3、準備訪問其右子樹
            cur = top->right;
        }
        return ret; //返回前序遍歷結果
    }
};

二叉樹的中序遍歷

C++ 非遞歸實現二叉樹的前中后序遍歷

二叉樹的中序遍歷順序是:左子樹 → 根 → 右子樹,我們可以先將二叉樹的左路結點入棧,當左路結點入棧完畢后,再從棧頂依次取出結點,在取出結點的同時便對其進行訪問,此時就相當于先訪問了左子樹再訪問了根,之后再用同樣的方式訪問取出結點的右子樹即可。

具體步驟如下:

  1. 將左路結點入棧。
  2. 取出棧頂結點top并訪問。
  3. 準備訪問top結點的右子樹。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
    //中序遍歷
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> st; //輔助棧
        vector<int> ret; //用于存放中序遍歷的結果
        TreeNode* cur = root;
        while (cur || !st.empty())
        {
            //1、將左路結點入棧
            while (cur)
            {
                st.push(cur);
                cur = cur->left;
            }
            //2、取出棧頂結點并訪問
            TreeNode* top = st.top();
            st.pop();
            ret.push_back(top->val);
            //3、準備訪問其右子樹
            cur = top->right;
        }
        return ret; //返回中序遍歷結果
    }
};

二叉樹的后序遍歷

C++ 非遞歸實現二叉樹的前中后序遍歷

二叉樹的后序遍歷順序是:左子樹 → 右子樹 → 根,我們可以先將二叉樹的左路結點入棧,當左路結點入棧完畢后,再觀察棧頂結點,若棧頂結點的右子樹為空,或棧頂結點的右子樹已經被訪問過了,則棧頂結點可以出棧并訪問,若棧頂結點的右子樹還未被訪問,則用同樣的方式訪問棧頂結點的右子樹,直到其右子樹被訪問后再訪問該結點,這時的訪問順序遵循了二叉樹的后序遍歷所要求的順序。

具體步驟如下:

  1. 將左路結點入棧。
  2. 觀察棧頂結點top。
  3. 若top結點的右子樹為空,或top結點的右子樹已經訪問過了,則訪問top結點。訪問top結點后將其從棧中彈出,并更新上一次訪問的結點為top。
  4. 若top結點的右子樹還未被訪問,則準備訪問其右子樹。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
    //后序遍歷
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st; //輔助棧
        vector<int> ret; //用于存放后序遍歷的結果
        TreeNode* cur = root;
        TreeNode* prev = nullptr; //記錄上一次訪問的結點
        while (cur || !st.empty())
        {
            //1、將左路結點入棧
            while (cur)
            {
                st.push(cur);
                cur = cur->left;
            }
            //2、取出棧頂結點
            TreeNode* top = st.top();
            //3、若取出結點的右子樹為空,或右子樹已經訪問過了,則訪問該結點
            if (top->right == nullptr || top->right == prev)
            {
                //訪問top結點后將其從棧中彈出
                st.pop();
                ret.push_back(top->val);
                //更新上一次訪問的結點為top
                prev = top;
            }
            else //4、若取出結點的右子樹還未被訪問,則準備訪問其右子樹
            {
                cur = top->right;
            }
        }
        return ret; //返回后序遍歷結果
    }
};

注意: 看動圖演示時請結合所給代碼,動圖是嚴格按照代碼的邏輯制作的。

到此這篇關于C++ 非遞歸實現二叉樹的前中后序遍歷的文章就介紹到這了,更多相關二叉樹前中后序遍歷內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/chenlong_cxy/article/details/121089187

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 久久久av | 国产精品自拍在线观看 | 久久综合成人精品亚洲另类欧美 | 亚洲视频综合 | 亚洲欧美视频在线播放 | 久久久成人免费 | 国语av在线 | 久久精品美女 | 日韩中文字幕在线播放 | 亚洲精品久久久久久一区二区 | 成人伊人网 | 日本va欧美va精品发布 | 国产婷婷色一区二区三区 | 国产日韩视频 | 亚洲国产精品久久 | 亚洲色图综合 | 日本激情视频 | 国产精品免费观看 | 91精品蜜臀在线一区尤物 | 午夜影院免费 | 一区二区三区在线看 | 精品无码久久久久久国产 | 午夜免费在线 | 国产在线精品一区二区三区 | 欧美中文字幕一区 | 婷婷精品久久久久久久久久不卡 | 国产亚洲精品精品国产亚洲综合 | 高清一区二区三区日本久 | 欧美xo影院 | 成人午夜性a一级毛片免费看 | 最好的2019中文大全在线观看 | 久久久久久久成人 | 亚洲国产精品一区二区三区 | 国产中文 | 日本久久久久久久久久久久 | 最近中文字幕免费mv视频7 | 色精品| 久久精品国产99国产 | 日韩在线一区二区三区免费视频 | 国产黄色免费看 | 国产精品国色综合久久 |