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

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

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

二叉樹的前序遍歷

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

具體步驟如下:

  1. 將左路結點入棧,入棧的同時訪問左路結點。
  2. 取出棧頂結點top。
  3. 準備訪問top結點的右子樹。
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; //返回前序遍歷結果
	}
};

二叉樹的中序遍歷

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

具體步驟如下:

  1. 將左路結點入棧。
  2. 取出棧頂結點top并訪問。
  3. 準備訪問top結點的右子樹。
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; //返回中序遍歷結果
	}
};

二叉樹的后序遍歷

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

具體步驟如下:

  1. 將左路結點入棧。
  2. 觀察棧頂結點top。
  3. 若top結點的右子樹為空,或top結點的右子樹已經訪問過了,則訪問top結點。訪問top結點后將其從棧中彈出,并更新上一次訪問的結點為top。
  4. 若top結點的右子樹還未被訪問,則準備訪問其右子樹。
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++ 非遞歸實現二叉樹的前中后序遍歷的文章就介紹到這了,更多相關二叉樹前中后序遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 單詞小助手C語言版

    單詞小助手C語言版

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

    C語言實現簡易貪吃蛇游戲的示例代碼

    這篇文章主要介紹了如何利用C語言實現一個經典的小游戲——貪吃蛇,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-10-10
  • C++的sstream標準庫詳細介紹

    C++的sstream標準庫詳細介紹

    以下是對C++中的的sstream標準庫進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • vs2022項目文件夾內.vs文件夾容量虛高問題的解決

    vs2022項目文件夾內.vs文件夾容量虛高問題的解決

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

    C++函數模板與重載解析超詳細講解

    模板是C++最重要的設計。這篇文章講的是函數模板,只是簡單介紹模板的一些功能,關于模板的更多的內容會在類模板中詳細介紹。文章還著重介紹了重載解析過程
    2022-08-08
  • 提高C++程序運行效率的10個簡單方法

    提高C++程序運行效率的10個簡單方法

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

    C語言預處理器使用方法講解

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

    淺析C++中dynamic_cast和static_cast實例語法詳解

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

    C語言編程中借助pthreads庫進行多線程編程的示例

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

    C++ 網絡編程 總結

    這篇文章主要介紹了C++ 網絡編程的一些詳細相關內容,有需要的小伙伴可以參考下。
    2015-06-06

最新評論

桐乡市| 体育| 隆安县| 韶山市| 永宁县| 临漳县| 玉树县| 和田市| 张家界市| 崇阳县| 莱西市| 金坛市| 葫芦岛市| 集安市| 绥棱县| 合川市| 时尚| 靖宇县| 林州市| 普宁市| 北川| 杭州市| 溧阳市| 宜黄县| 湖州市| 山阴县| 托克托县| 鄂伦春自治旗| 巴彦县| 瑞安市| 长白| 丰都县| 余姚市| 新宾| 天峨县| 都江堰市| 海南省| 建平县| 德昌县| 阿尔山市| 赤城县|