成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

tuantuan / 3535人閱讀

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

二叉樹的前序遍歷


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

具體步驟如下:

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

二叉樹的中序遍歷


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

具體步驟如下:

  1. 將左路結(jié)點入棧。
  2. 取出棧頂結(jié)點top并訪問。
  3. 準備訪問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、準備訪問其右子樹			cur = top->right;		}		return ret; //返回中序遍歷結(jié)果	}};

二叉樹的后序遍歷


二叉樹的后序遍歷順序是:左子樹 → 右子樹 → 根,我們可以先將二叉樹的左路結(jié)點入棧,當左路結(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é)點的右子樹還未被訪問,則準備訪問其右子樹。
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é)點的右子樹還未被訪問,則準備訪問其右子樹			{				cur = top->right;			}		}		return ret; //返回后序遍歷結(jié)果	}};

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

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

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

相關文章

發(fā)表評論

0條評論

閱讀需要支付1元查看
<