編譯環境
IDE: codeblocks
Compiler: GNU GCC
建立的二叉樹結構圖如下:
/***************************************************************************<br /> * 功 能:二叉樹的常用操作(建立、先中後序遞迴與非遞迴遍曆、層序遍曆)<br /> * 作 者:JarvisChu<br /> * 時 間:2011-04-24<br />****************************************************************************/</p><p>#include <iostream><br />#include <malloc.h><br />#include <queue><br />#include <stack><br />//#include <string><br />//#define _DEBUG_CODE //輸出調試過程中變數的值<br />//#define _DEBUG_CODE_STACK //測試棧<br />//#define _DEBUG_CODE_QUEUE //測試隊列<br />using namespace std;<br />typedef struct BiTNode { //二叉樹<br /> char data;<br /> struct BiTNode* lchild;//左孩子<br /> struct BiTNode* rchild;//右孩子<br />} BiTNode,BiTree;<br />bool Visit(BiTNode* node) {<br /> cout<<node->data<<" ";<br /> return true;<br />}<br />//初始化二叉樹,分配頭結點的空間<br />bool InitBiTree(BiTree* T) {<br /> if(T != NULL){<br /> T->data='t';<br /> T->lchild = T->rchild = NULL;<br /> return true;<br /> }<br /> return false;<br />}<br />//構建二叉樹<br />bool CreateBiTree(BiTree* T) {<br /> BiTNode* node;<br /> node = (BiTNode*)malloc(sizeof(BiTNode)); //根節點<br /> if(node == NULL) {<br /> return false;<br /> }<br /> node->data = 'a';<br /> node->lchild = NULL;<br /> node->rchild = NULL;<br /> T->lchild = node;<br />#ifdef _DEBUG_CODE<br /> cout<<"根節點建立成功"<<endl;<br /> cout<<T->data<<endl;<br />#endif<br /> node = (BiTNode*)malloc(sizeof(BiTNode));//左孩子<br /> if(node == NULL) {<br /> return false;<br /> }<br /> node->data = 'b';<br /> node->lchild = NULL;<br /> node->rchild = NULL;<br /> T->lchild->lchild = node;<br /> node = (BiTNode*)malloc(sizeof(BiTNode));//右孩子<br /> if(node == NULL) {<br /> return false;<br /> }<br /> node->data = 'c';<br /> node->lchild = NULL;<br /> node->rchild = NULL;<br /> T->lchild->rchild = node;<br /> return true;<br />}<br />//銷毀二叉樹,釋放空間<br />bool DestroyTree(BiTree* T) {<br /> //遞迴釋放(後續遍曆)<br /> if(T != NULL) {<br /> DestroyTree(T->lchild);<br /> DestroyTree(T->rchild);<br /> free(T);<br /> }<br /> return true;<br />}<br />//遞迴先序遍曆二叉樹<br />bool PreOrderTraverse(BiTree* T) {<br /> if(T != NULL) {<br /> cout<<T->data<<" ";<br /> PreOrderTraverse(T->lchild);<br /> PreOrderTraverse(T->rchild);<br /> }<br /> return true;<br />}<br />//遞迴中序遍曆二叉樹<br />bool InOrderTraverse(BiTree* T) {<br /> if(T != NULL) {<br /> InOrderTraverse(T->lchild);<br /> cout<<T->data<<" ";<br /> InOrderTraverse(T->rchild);<br /> }<br /> return true;<br />}<br />//遞迴後序遍曆二叉樹<br />bool PostOrderTraverse(BiTree* T) {<br /> if(T != NULL) {<br /> PostOrderTraverse(T->lchild);<br /> PostOrderTraverse(T->rchild);<br /> cout<<T->data<<" ";<br /> }<br /> return true;<br />}<br />//非遞迴先序遍曆二叉樹<br />bool PreOrderTraverse_n(BiTree* T){//壓棧時訪問<br />#ifdef _DEBUG_CODE_STACK<br /> //測試棧<br /> stack<int> s;<br /> s.push(1);<br /> s.push(2);<br /> s.push(3);<br /> int i = (int)s.top();<br /> cout<<i<<endl;<br />#else<br /> stack<BiTNode*> s;<br /> BiTNode* node;<br /> node = T;<br /> while(!s.empty() || node != NULL){//棧不空或者node不空時做迴圈<br /> while(node != NULL){<br /> Visit(node);//訪問節點<br /> s.push(node);//壓棧<br /> node = node->lchild;//訪問左子樹<br /> }<br /> node = (BiTNode*)s.top();//棧頂節點<br /> s.pop();//彈棧<br /> if(node != NULL){<br /> node = node->rchild;//訪問右子樹<br /> }<br /> }<br />#endif<br /> return true;<br />}<br />//非遞迴中序遍曆二叉樹<br />bool InOrderTraverse_n(BiTree* T){//彈棧時訪問<br /> stack<BiTNode*> s;<br /> BiTNode* node;<br /> node = T;<br /> while(!s.empty() || node != NULL){//棧不空或者node不空時做迴圈<br /> while(node != NULL){<br /> s.push(node);//壓棧<br /> node = node->lchild;//訪問左子樹<br /> }<br /> node = (BiTNode*)s.top();//棧頂節點<br /> s.pop();//彈棧<br /> if(node != NULL){<br /> Visit(node);//訪問節點<br /> node = node->rchild;//訪問右子樹<br /> }<br /> }<br /> return true;<br />}<br />//非遞迴後序遍曆二叉樹<br />bool PostOrderTraverse_n(BiTree* T){<br /> stack<BiTNode*> s;<br /> BiTNode* node;<br /> BiTNode* pre;<br /> node = T;<br /> while(!s.empty() || node != NULL){//棧不空或者node不空時做迴圈<br /> while(node != NULL){<br /> s.push(node);//壓棧<br /> node = node->lchild;//訪問左子樹<br /> }<br /> node = (BiTNode*)s.top();//棧頂節點<br /> if(node->rchild == NULL || node->rchild == pre){//node的右孩子是空,或者剛剛被訪問過了<br /> Visit(node);//訪問<br /> s.pop();//彈棧<br /> pre = node;<br /> node = NULL;<br /> }<br /> else{<br /> node = node->rchild;<br /> }<br /> }<br /> return true;<br />}<br />//層序遍曆二叉樹<br />bool LevelOrderTraverse(BiTree* T){<br />#ifdef _DEBUG_CODE_QUEUE<br /> queue<int> q;<br /> q.push(1);<br /> q.push(2);<br /> q.push(3);<br /> q.push(4);<br /> cout<<(int)q.front()<<endl;<br /> q.pop();<br /> cout<<(int)q.front()<<endl;<br /> q.pop();<br /> cout<<(int)q.front()<<endl;<br /> q.pop();<br /> cout<<(int)q.front()<<endl;<br />#else<br /> queue<BiTNode*> q;//節點隊列<br /> BiTNode* node;<br /> if(T != NULL){//不是空樹<br /> q.push(T);<br /> }<br /> else{<br /> return false;<br /> }<br /> while(!q.empty()){<br /> node = (BiTNode*) q.front();//隊首節點<br /> q.pop();//隊首節點出隊<br /> Visit(node);<br /> if(node->lchild != NULL){<br /> q.push(node->lchild);<br /> }<br /> if(node->rchild != NULL){<br /> q.push(node->rchild);<br /> }<br /> }<br />#endif<br /> return true;<br />}<br />int main() {<br /> BiTree* T = NULL;<br /> T = (BiTree*)malloc(sizeof(BiTree));//分配頭結點<br /> if(T == NULL) {<br /> cout<<"非配頭結點失敗"<<endl;<br /> return 1;<br /> }<br /> if(!InitBiTree(T)) {//初始化二叉樹<br /> cout<<"初始化失敗"<<endl;<br /> }<br /> CreateBiTree(T);//構建二叉樹<br />#ifdef _DEBUG_CODE<br /> cout<<T->lchild->data<<endl;<br /> cout<<T->lchild->lchild->data<<endl;<br /> cout<<T->lchild->rchild->data<<endl;<br />#endif<br /> cout<<"*********遞迴先序遍曆**********"<<endl;<br /> PreOrderTraverse(T);//先序遍曆<br /> cout<<endl<<"*********遞迴中序遍曆**********"<<endl;<br /> InOrderTraverse(T);//中序遍曆<br /> cout<<endl<<"*********遞迴後序遍曆**********"<<endl;<br /> PostOrderTraverse(T);<br /> cout<<endl<<"********非遞迴先序遍曆**********"<<endl;<br /> PreOrderTraverse_n(T);<br /> cout<<endl<<"********非遞迴中序遍曆**********"<<endl;<br /> InOrderTraverse_n(T);<br /> cout<<endl<<"********非遞迴後序遍曆**********"<<endl;<br /> PostOrderTraverse_n(T);<br /> cout<<endl<<"********層序遍曆**********"<<endl;<br /> LevelOrderTraverse(T);<br /> return 0;<br />}<br />