成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

tuantuan / 3442人閱讀

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

二叉樹的前序遍歷


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

具體步驟如下:

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

二叉樹的中序遍歷


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

具體步驟如下:

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

二叉樹的后序遍歷


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

具體步驟如下:

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124503.html

相關(guān)文章

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<