二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
文章目錄
- 前言
- 一、前序遍歷(迭代法)
- 二.中序遍歷(迭代法)
- 三、后序遍歷(迭代法)
- 總結(jié)
前言
「遞歸的實(shí)現(xiàn)就是:每一次遞歸調(diào)用都會把函數(shù)的局部變量、參數(shù)值和返回地址等壓入調(diào)用棧中」,然后遞歸返回的時候,從棧頂彈出上一次遞歸的各項參數(shù),所以這就是遞歸為什么可以返回上一層位置的原因。所以我們用棧也可以是實(shí)現(xiàn)二叉樹的前后中序遍歷。
一、前序遍歷(迭代法)
前序遍歷是中左右,每次先處理的是中間節(jié)點(diǎn),那么先將根節(jié)點(diǎn)放入棧中,然后將右孩子加入棧,再加入左孩子。
為什么要先加入 右孩子,再加入左孩子呢?因?yàn)檫@樣出棧的時候才是中左右的順序。
注:前序遍歷要訪問的元素和要處理的元素順序是一致的,都是中間節(jié)點(diǎn)
class Solution { public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*>st;vector<int> res;st.push(root);while(!st.empty()){TreeNode* node=st.top();//中st.pop();if(node!=nullptr){res.push_back(node->val);st.push(node->right);//右st.push(node->left); //左}}return res;} };二.中序遍歷(迭代法)
中序遍歷是左中右,先訪問的是二叉樹頂部的節(jié)點(diǎn),然后一層一層向下訪問,直到到達(dá)樹左面的最底部,再開始處理節(jié)點(diǎn)(也就是在把節(jié)點(diǎn)的數(shù)值放進(jìn)result數(shù)組中),這就造成了「處理順序和訪問順序是不一致的。」
class Solution { public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if(cur!=NULL){st.push(cur);cur=cur->left;//左}else{cur=st.top();// 從棧里彈出的數(shù)據(jù),就是要處理的數(shù)據(jù)(放進(jìn)res數(shù)組里的數(shù)據(jù))st.pop();res.push_back(cur->val);//中cur=cur->right; //右}}return res;} };三、后序遍歷(迭代法)
先序遍歷是中左右,后續(xù)遍歷是左右中,那么我們只需要調(diào)整一下先序遍歷的代碼順序,就變成中右左的遍歷順序,然后在反轉(zhuǎn)result數(shù)組,輸出的結(jié)果順序就是左右中了,如下圖:
總結(jié)
先序:節(jié)點(diǎn)的訪問順序與處理順序一致,所以直接處理棧頂元素(即將棧頂元素放入結(jié)果數(shù)組中),然后將右孩子、左孩子依次入棧(這樣下次處理的棧頂元素就是左孩子)
中序:節(jié)點(diǎn)的訪問順序和處理順序不一致。使用一個變量保存當(dāng)前訪問的節(jié)點(diǎn),如果當(dāng)前訪問的節(jié)點(diǎn)有左孩子,當(dāng)前節(jié)點(diǎn)壓棧,當(dāng)前節(jié)點(diǎn)指向該節(jié)點(diǎn)的左孩子;如果當(dāng)前節(jié)點(diǎn)沒有左孩子,那么處理該節(jié)點(diǎn),然后繼續(xù)訪問該節(jié)點(diǎn)的右子樹。
后序:先序遍歷的順序是中左右,使用先序的代碼可以中右左遍歷,然后反轉(zhuǎn)就可以了
前序和中序是完全兩種代碼風(fēng)格,并不像遞歸寫法那樣代碼稍做調(diào)整,就可以實(shí)現(xiàn)前后中序。思考一下 二叉樹前后中序遍歷的迭代法實(shí)現(xiàn),能不能風(fēng)格一?像遞歸寫法一樣稍作修改前序遍歷的代碼就可以實(shí)現(xiàn)中后序遍歷?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的二叉树的前中后序遍历之迭代法(非统一风格迭代方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树的基础知识
- 下一篇: 二叉树的前中后序遍历之迭代法(统一风格迭