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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二叉树的前序、中序、后续、层序遍历(包含递归与非递归)

發(fā)布時(shí)間:2025/3/11 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的前序、中序、后续、层序遍历(包含递归与非递归) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

遞歸形式

遞歸形式遍歷比較簡(jiǎn)單,不做詳細(xì)論述。
前序遍歷

void Preorder(treenode* root) //前序 {if (root != NULL){printf("%c", root->data);Preorder(root->left);Preorder(root->right);}

中序遍歷

} void Inorder(treenode* root) //中序 {if (root != NULL){ Inorder(root->left);printf("%c", root->data);Inorder(root->right);}}

后序遍歷

void Postorder(treenode* root) //后序 {if (root != NULL){Postorder(root->left);Postorder(root->right);printf("%c", root->data);} }

非遞歸形式

前序遍歷
開始不斷向左孩子遍歷并入棧,在入棧的同時(shí)打印節(jié)點(diǎn)數(shù)據(jù),直到左孩子為空,此時(shí)獲取棧頂節(jié)點(diǎn),并將其出棧,判斷其有無右孩子,如果無右孩子,就再次獲取棧頂節(jié)點(diǎn)并出棧,重復(fù)上述操作;如果有右孩子就將其入棧,并不斷遍歷其左孩子直到為空,重復(fù)上述操作,直到棧為空。

void PreOrder(treenode* root) {if (root == NULL)return;treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//邊遍歷邊打印,并存入棧中while (p){printf("%c ", p->data);s.push(p);p = p->left;}//當(dāng)p為空時(shí),說明根和左子樹都遍歷完了,進(jìn)入右子樹if (!s.empty()){p = s.top();s.pop();p = p->right;}} }

中序遍歷
從根節(jié)點(diǎn)開始不斷向左孩子遍歷并入棧,直到為空,只要沒有左孩子就出棧,在出棧的同時(shí)就打印節(jié)點(diǎn)數(shù)據(jù),此時(shí)在判斷出棧節(jié)點(diǎn)是否有右孩子,如果有右孩子重復(fù)上述操作繼續(xù)向左孩子遍歷,如果沒有就出棧,重復(fù)上述操作判斷有無右孩子,直到棧為空就退出遍歷。

void InOrder(treenode* root) {//空樹if (root == NULL)return;//樹非空treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//一直遍歷到左子樹最下邊,邊遍歷邊保存根節(jié)點(diǎn)到棧中while (p){s.push(p);p = p->left;}//當(dāng)p為空時(shí),說明已經(jīng)到達(dá)左子樹最下邊,這時(shí)需要出棧了if (!s.empty()){p = s.top();s.pop();printf("%c ", p->data);//進(jìn)入右子樹p = p->right;}} }

后序遍歷
后續(xù)在理解上較為難,用兩個(gè)棧s1,s2更為直觀,便于理解。
首先將根節(jié)點(diǎn)放入s2,再將其左右孩子放入s1中,一定要先放入左孩子,再放入右孩子,此時(shí)在獲取s1棧頂節(jié)點(diǎn)并出棧,判斷其是否有左右孩子,只要有孩子就將該節(jié)點(diǎn)入棧s2,并將該節(jié)點(diǎn)左右孩子放入s1中;如果該節(jié)點(diǎn)無左右孩子那么直接出棧s2并入棧s1,重復(fù)上述操作直到s1為空,在將s2從棧頂打印到棧底便是后續(xù)遍歷

void PostOrder(treenode *root) {stack<treenode *>s1, s2;treenode *cur=root; s1.push(cur);//入棧根節(jié)點(diǎn)while (!s1.empty()){cur = s1.top();//出棧s1入棧s2s1.pop();s2.push(cur);//判斷是否有左右孩子,有則入棧s1if (cur->left)s1.push(cur->left);if (cur->right)s1.push(cur->right);}while (!s2.empty()){printf("%c ", s2.top()->data);//打印s2s2.pop();} }

層序遍歷
層序遍歷需要用到隊(duì)列,先入隊(duì)根節(jié)點(diǎn),在出隊(duì),將其左右孩子入隊(duì),依次出隊(duì)入隊(duì)操作,只要該節(jié)點(diǎn)有孩子就入隊(duì),再出隊(duì)的同時(shí)打印節(jié)點(diǎn)數(shù)據(jù)

void sequence(treenode *root) {deque<treenode *>q;treenode *cur = root;q.push_back(cur);//根節(jié)點(diǎn)入隊(duì)while (!q.empty()){cur = q.front();//獲取隊(duì)頭q.pop_front();printf("%c ", cur->data);//孩子入隊(duì)if (cur->left)q.push_back(cur->left);if (cur->right)q.push_back(cur->right);} }

總結(jié)

以上是生活随笔為你收集整理的二叉树的前序、中序、后续、层序遍历(包含递归与非递归)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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