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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理论基础 —— 二叉树 —— 二叉树的遍历

發布時間:2025/3/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理论基础 —— 二叉树 —— 二叉树的遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【遞歸遍歷】

以二叉鏈表的存儲結構為例

1.先序遍歷

若二叉樹為空,則空操作,否則:先訪問根結點,再先序遍歷左子樹,然后先序遍歷右子樹

void preOrder(Node *bt){//先序遍歷根結點為bt的二叉樹的遞歸算法if(bt==NULL)return;else{cout<<bt->data;//輸出根節點bt的數據域preOrder(bt->lchild);//前序遍歷bt的左子樹preOrder(bt->rchild);//前序遍歷bt的右子樹} }

2.中序遍歷

若二叉樹為空,則空操作,否則:先中序遍歷左子樹,再訪問根結點,然后中序遍歷右子樹

void inOrder(Node *bt){//中序遍歷根結點為bt的二叉樹的遞歸算法if(bt==NULL)return;else{inOrder(bt->lchild);//中序遍歷bt的左子樹cout<<bt->data;//輸出根節點bt的數據域inOrder(bt->rchild);//中序遍歷bt的右子樹} }

3.后序遍歷

若二叉樹為空,則空操作,否則:先后序遍歷左子樹,再后序遍歷右子樹,然后訪問根結點

void postOrder(Node *bt){//后序遍歷根結點為bt的二叉樹的遞歸算法if(bt==NULL)return;else{postOrder(bt->lchild);//后序遍歷bt的左子樹postOrder(bt->rchild);//后序遍歷bt的右子樹cout<<bt->data;//輸出根結點bt的數據域} }

4.層序遍歷?

從根結點開始,首先將根結點入隊,然后從隊首取出一個元素,訪問該指針所指的結點,若該指針所指的結點左、右孩子非空,則將其左孩子指針、右孩子指針入隊,重復上述操作,直至隊列為空。

void levelOrder(Node *root){queue<Node *> Q;if(root)Q.push(root);while(!Q.empty()){root=Q.front();//取隊列首結點Q.pop();cout<<root->data;//訪問當前結點if(root->lchild)//左子樹進隊列Q.push(root->lchild);if(root->rchild) //右子樹進隊列Q.push(root->rchild); } }

【非遞歸遍歷】

以二叉鏈表的存儲結構為例

1.先序遍歷

借助棧,遇到一個結點,就訪問該結點,并把此結點推入棧中,然后遍歷它的左子樹,遍歷完它的左子樹后,從棧頂托出這個結點,并按照它的右鏈接指示的地址再去遍歷該結點的右子樹結構。

void preOrder(Node *root) {stack<Node *> s;while(root!=NULL || !s.empty()) {while (root!= NULL){cout<<root->data;s.push(root);root=root->lchild;}if(!s.empty()) {root=s.pop();root=root->rchild;}} }

2.中序遍歷

借助棧,遇到一個結點,就把它推入棧中,并去遍歷它的左子樹,遍歷完左子樹后,從棧頂托出這個結點并訪問之,然后按照它的右鏈接指示的地址再去遍歷該結點的右子樹。

void inOrder(Node *root){stack<Node * > s;while(root!=NULL || !s.empty()) {while(root!=NULL){s.push(root);root=root->lchild;}if(!s.empty()) {root=s.top();s.pop();cout<<root->data;root=root->rchild;}} }

3.后序遍歷

借助棧,遇到一個結點,把它推入棧中,遍歷它的左子樹,左子樹遍歷結束后,還不能馬上訪問處于棧頂的該結點,而是要再按照它的右鏈接結構指示的地址去遍歷該結點的右子樹,遍歷遍右子樹后才能從棧頂托出該結點并訪問。

void postOrder(Node *root) {stack<Node *> s;Node *cur,*pre=NULL;if(root==NULL)return;s.push(root);while (!s.empty()) {cur=s.top();if ((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))) {cout<<cur->data;s.pop();pre=cur;}else {if (cur->rchild!=NULL)s.push(cur->rchild);if (cur->lchild!=NULL)s.push(cur->lchild);}} }

?

總結

以上是生活随笔為你收集整理的理论基础 —— 二叉树 —— 二叉树的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。