摘要:文章目錄二叉樹(shù)的前序遍歷二叉樹(shù)的中序遍歷二叉樹(shù)的后序遍歷二叉樹(shù)的前序遍歷在不使用遞歸的方式遍歷二叉樹(shù)時(shí),我們可以使用一個(gè)棧模擬遞歸的機(jī)制。
在不使用遞歸的方式遍歷二叉樹(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ù)即可。
具體步驟如下:
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ù)的左路結(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ù)即可。
具體步驟如下:
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ù)的左路結(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ù)的后序遍歷所要求的順序。
具體步驟如下:
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
摘要:當(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)的。 ...
摘要:在數(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); 前言...
摘要:在數(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); 前言...
閱讀 2454·2021-11-24 10:31
閱讀 3534·2021-11-23 09:51
閱讀 2374·2021-11-15 18:11
閱讀 2493·2021-09-02 15:15
閱讀 2537·2019-08-29 17:02
閱讀 2378·2019-08-29 15:04
閱讀 930·2019-08-29 12:27
閱讀 2946·2019-08-28 18:15