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

C++ 非遞歸實(shí)現(xiàn)二叉樹的前中后序遍歷

 更新時(shí)間:2021年11月23日 15:19:40   作者:2021dragon  
本文將結(jié)合動(dòng)畫和代碼演示如何通過C++ 非遞歸實(shí)現(xiàn)二叉樹的前中后序的遍歷,代碼具有一定的價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下

二叉樹的前序遍歷

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

具體步驟如下:

  1. 將左路結(jié)點(diǎn)入棧,入棧的同時(shí)訪問左路結(jié)點(diǎn)。
  2. 取出棧頂結(jié)點(diǎn)top。
  3. 準(zhǔn)備訪問top結(jié)點(diǎn)的右子樹。
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; //用于存放前序遍歷的結(jié)果
		TreeNode* cur = root;
		while (cur || !st.empty())
		{
			//1、將左路結(jié)點(diǎn)入棧,入棧的同時(shí)訪問左路結(jié)點(diǎn)
			while (cur)
			{
				st.push(cur);
				ret.push_back(cur->val);
				cur = cur->left;
			}
			//2、取出棧頂結(jié)點(diǎn)
			TreeNode* top = st.top();
			st.pop();
			//3、準(zhǔn)備訪問其右子樹
			cur = top->right;
		}
		return ret; //返回前序遍歷結(jié)果
	}
};

二叉樹的中序遍歷

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

具體步驟如下:

  1. 將左路結(jié)點(diǎn)入棧。
  2. 取出棧頂結(jié)點(diǎn)top并訪問。
  3. 準(zhǔn)備訪問top結(jié)點(diǎn)的右子樹。
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; //用于存放中序遍歷的結(jié)果
		TreeNode* cur = root;
		while (cur || !st.empty())
		{
			//1、將左路結(jié)點(diǎn)入棧
			while (cur)
			{
				st.push(cur);
				cur = cur->left;
			}
			//2、取出棧頂結(jié)點(diǎn)并訪問
			TreeNode* top = st.top();
			st.pop();
			ret.push_back(top->val);
			//3、準(zhǔn)備訪問其右子樹
			cur = top->right;
		}
		return ret; //返回中序遍歷結(jié)果
	}
};

二叉樹的后序遍歷

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

具體步驟如下:

  1. 將左路結(jié)點(diǎn)入棧。
  2. 觀察棧頂結(jié)點(diǎn)top。
  3. 若top結(jié)點(diǎn)的右子樹為空,或top結(jié)點(diǎn)的右子樹已經(jīng)訪問過了,則訪問top結(jié)點(diǎn)。訪問top結(jié)點(diǎn)后將其從棧中彈出,并更新上一次訪問的結(jié)點(diǎn)為top。
  4. 若top結(jié)點(diǎn)的右子樹還未被訪問,則準(zhǔn)備訪問其右子樹。
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; //用于存放后序遍歷的結(jié)果
		TreeNode* cur = root;
		TreeNode* prev = nullptr; //記錄上一次訪問的結(jié)點(diǎn)
		while (cur || !st.empty())
		{
			//1、將左路結(jié)點(diǎn)入棧
			while (cur)
			{
				st.push(cur);
				cur = cur->left;
			}
			//2、取出棧頂結(jié)點(diǎn)
			TreeNode* top = st.top();
			//3、若取出結(jié)點(diǎn)的右子樹為空,或右子樹已經(jīng)訪問過了,則訪問該結(jié)點(diǎn)
			if (top->right == nullptr || top->right == prev)
			{
				//訪問top結(jié)點(diǎn)后將其從棧中彈出
				st.pop();
				ret.push_back(top->val);
				//更新上一次訪問的結(jié)點(diǎn)為top
				prev = top;
			}
			else //4、若取出結(jié)點(diǎn)的右子樹還未被訪問,則準(zhǔn)備訪問其右子樹
			{
				cur = top->right;
			}
		}
		return ret; //返回后序遍歷結(jié)果
	}
};

注意: 看動(dòng)圖演示時(shí)請(qǐng)結(jié)合所給代碼,動(dòng)圖是嚴(yán)格按照代碼的邏輯制作的。

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

相關(guān)文章

  • 單詞小助手C語言版

    單詞小助手C語言版

    這篇文章主要為大家詳細(xì)介紹了C語言版的單詞小助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲的示例代碼

    C語言實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲的示例代碼

    這篇文章主要介紹了如何利用C語言實(shí)現(xiàn)一個(gè)經(jīng)典的小游戲——貪吃蛇,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-10-10
  • C++的sstream標(biāo)準(zhǔn)庫詳細(xì)介紹

    C++的sstream標(biāo)準(zhǔn)庫詳細(xì)介紹

    以下是對(duì)C++中的的sstream標(biāo)準(zhǔn)庫進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • vs2022項(xiàng)目文件夾內(nèi).vs文件夾容量虛高問題的解決

    vs2022項(xiàng)目文件夾內(nèi).vs文件夾容量虛高問題的解決

    經(jīng)常會(huì)發(fā)現(xiàn)VS的項(xiàng)目文件夾占用空間很大,本文主要介紹了vs2022項(xiàng)目文件夾內(nèi).vs文件夾容量虛高問題的解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C++函數(shù)模板與重載解析超詳細(xì)講解

    C++函數(shù)模板與重載解析超詳細(xì)講解

    模板是C++最重要的設(shè)計(jì)。這篇文章講的是函數(shù)模板,只是簡(jiǎn)單介紹模板的一些功能,關(guān)于模板的更多的內(nèi)容會(huì)在類模板中詳細(xì)介紹。文章還著重介紹了重載解析過程
    2022-08-08
  • 提高C++程序運(yùn)行效率的10個(gè)簡(jiǎn)單方法

    提高C++程序運(yùn)行效率的10個(gè)簡(jiǎn)單方法

    這篇文章主要介紹了提高C++程序運(yùn)行效率的10個(gè)簡(jiǎn)單方法,包括了循環(huán)、變量、繼承等等應(yīng)用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C語言預(yù)處理器使用方法講解

    C語言預(yù)處理器使用方法講解

    C預(yù)處理器不是編譯器的組成部分,但是它是編譯過程中一個(gè)單獨(dú)的步驟。簡(jiǎn)言之,C預(yù)處理器只不過是一個(gè)文本替換工具而已,它們會(huì)指示編譯器在實(shí)際編譯之前完成所需的預(yù)處理。我們將把C預(yù)處理器(C Preprocessor)簡(jiǎn)寫為CPP
    2022-12-12
  • 淺析C++中dynamic_cast和static_cast實(shí)例語法詳解

    淺析C++中dynamic_cast和static_cast實(shí)例語法詳解

    這篇文章主要介紹了淺析C++中dynamic_cast和static_cast實(shí)例演示,包括static_cast語法知識(shí)和static_cast的作用講解,namic_cast 語法詳解,需要的朋友可以參考下
    2021-07-07
  • C語言編程中借助pthreads庫進(jìn)行多線程編程的示例

    C語言編程中借助pthreads庫進(jìn)行多線程編程的示例

    這篇文章主要介紹了C語言編程中借助pthreads庫進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下
    2015-11-11
  • C++ 網(wǎng)絡(luò)編程 總結(jié)

    C++ 網(wǎng)絡(luò)編程 總結(jié)

    這篇文章主要介紹了C++ 網(wǎng)絡(luò)編程的一些詳細(xì)相關(guān)內(nèi)容,有需要的小伙伴可以參考下。
    2015-06-06

最新評(píng)論

大石桥市| 凤山县| 尖扎县| 搜索| 天峻县| 博白县| 云霄县| 邯郸县| 建湖县| 鄂尔多斯市| 南康市| 庆安县| 定远县| 两当县| 永仁县| 太白县| 兴和县| 聂拉木县| 睢宁县| 昌宁县| 福建省| 南投县| 宜都市| 潞西市| 金乡县| 龙岩市| 陆丰市| 万源市| 吉木萨尔县| 来安县| 邻水| 大厂| 南和县| 宁晋县| 海丰县| 玉环县| 巍山| 顺平县| 克什克腾旗| 日土县| 疏附县|