亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

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

tuantuan / 3533人閱讀

摘要:文章目錄二叉樹(shù)的前序遍歷二叉樹(shù)的中序遍歷二叉樹(shù)的后序遍歷二叉樹(shù)的前序遍歷在不使用遞歸的方式遍歷二叉樹(shù)時(shí),我們可以使用一個(gè)棧模擬遞歸的機(jī)制。

二叉樹(shù)的前序遍歷


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

具體步驟如下:

  1. 將左路結(jié)點(diǎn)入棧,入棧的同時(shí)訪問(wèn)左路結(jié)點(diǎn)。
  2. 取出棧頂結(jié)點(diǎn)top。
  3. 準(zhǔn)備訪問(wèn)top結(jié)點(diǎn)的右子樹(shù)。
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í)訪問(wèn)左路結(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)備訪問(wèn)其右子樹(shù)			cur = top->right;		}		return ret; //返回前序遍歷結(jié)果	}};

二叉樹(shù)的中序遍歷


二叉樹(shù)的中序遍歷順序是:左子樹(shù) → 根 → 右子樹(shù),我們可以先將二叉樹(shù)的左路結(jié)點(diǎn)入棧,當(dāng)左路結(jié)點(diǎn)入棧完畢后,再?gòu)臈m斠来稳〕鼋Y(jié)點(diǎn),在取出結(jié)點(diǎn)的同時(shí)便對(duì)其進(jìn)行訪問(wèn),此時(shí)就相當(dāng)于先訪問(wèn)了左子樹(shù)再訪問(wèn)了根,之后再用同樣的方式訪問(wèn)取出結(jié)點(diǎn)的右子樹(shù)即可。

具體步驟如下:

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

二叉樹(shù)的后序遍歷


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

具體步驟如下:

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124503.html

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)初階之叉樹(shù)】:叉樹(shù)相關(guān)的性質(zhì)和經(jīng)典的習(xí)題(用C語(yǔ)言實(shí)現(xiàn),附圖詳解)

    摘要:當(dāng)集合為空時(shí),稱(chēng)該二叉樹(shù)為空二叉樹(shù)。也就是說(shuō),如果一個(gè)二叉樹(shù)的層數(shù)為,且結(jié)點(diǎn)總數(shù)是,則它就是滿(mǎn)二叉樹(shù)。完全二叉樹(shù)完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹(shù)是由滿(mǎn)二叉樹(shù)而引出來(lái)的。 ...

    Martin91 評(píng)論0 收藏0
  • 【從蛋殼到滿(mǎn)天飛】JAVA 數(shù)據(jù)結(jié)構(gòu)解析和算法實(shí)現(xiàn)-二分搜索樹(shù)

    摘要:在數(shù)據(jù)結(jié)構(gòu)領(lǐng)域?qū)?yīng)樹(shù)結(jié)構(gòu)來(lái)說(shuō)二叉樹(shù)是最常用的一種樹(shù)結(jié)構(gòu),二叉樹(shù)具有一個(gè)唯一的根節(jié)點(diǎn),也就是最上面的節(jié)點(diǎn)。二叉樹(shù)每個(gè)節(jié)點(diǎn)最多有兩個(gè)孩子,一個(gè)孩子都沒(méi)有的節(jié)點(diǎn)通常稱(chēng)之為葉子節(jié)點(diǎn),二叉樹(shù)每個(gè)節(jié)點(diǎn)最多有一個(gè)父親,根節(jié)點(diǎn)是沒(méi)有父親節(jié)點(diǎn)的。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言...

    ghnor 評(píng)論0 收藏0
  • 【從蛋殼到滿(mǎn)天飛】JAVA 數(shù)據(jù)結(jié)構(gòu)解析和算法實(shí)現(xiàn)-二分搜索樹(shù)

    摘要:在數(shù)據(jù)結(jié)構(gòu)領(lǐng)域?qū)?yīng)樹(shù)結(jié)構(gòu)來(lái)說(shuō)二叉樹(shù)是最常用的一種樹(shù)結(jié)構(gòu),二叉樹(shù)具有一個(gè)唯一的根節(jié)點(diǎn),也就是最上面的節(jié)點(diǎn)。二叉樹(shù)每個(gè)節(jié)點(diǎn)最多有兩個(gè)孩子,一個(gè)孩子都沒(méi)有的節(jié)點(diǎn)通常稱(chēng)之為葉子節(jié)點(diǎn),二叉樹(shù)每個(gè)節(jié)點(diǎn)最多有一個(gè)父親,根節(jié)點(diǎn)是沒(méi)有父親節(jié)點(diǎn)的。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言...

    FuisonDesign 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<