理论基础 —— 二叉树 —— 二叉树的遍历
生活随笔
收集整理的這篇文章主要介紹了
理论基础 —— 二叉树 —— 二叉树的遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【遞歸遍歷】
以二叉鏈表的存儲結構為例
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);}} }?
總結
以上是生活随笔為你收集整理的理论基础 —— 二叉树 —— 二叉树的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔板(洛谷-P2730)
- 下一篇: Sightseeing Cows(POJ