日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

發(fā)布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的前中后序遍历之迭代法(非统一风格迭代方式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、前序遍歷(迭代法)
  • 二.中序遍歷(迭代法)
  • 三、后序遍歷(迭代法)
  • 總結(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é)果順序就是左右中了,如下圖:

class Solution { public:vector<int> postorderTraversal(TreeNode* root) {vector<int>res;stack<TreeNode*>st;st.push(root);while(!st.empty()){TreeNode* node=st.top();st.pop();if(node!=NULL){res.push_back(node->val);st.push(node->left);st.push(node->right);}}reverse(res.begin(),res.end());return res;} };

總結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。