直接上代碼:
/* 二叉樹的鏈表實現: 以及三種遍歷方式: author:天下無雙 Date:2014-5-28 Version:2.0 */ #include#include typedef int T;//樹內節點的數據類型 using namespace std; class BiTree { private: struct BiNode{ T data; BiNode *lchild,*rchild; BiNode(T d){ data=d; lchild=nullptr; rchild=nullptr; } }; BiNode *root; public: BiTree(){ //root=root->rchild=root->rchild=nullptr; root=nullptr; } ~BiTree(){ } //使用遞歸創建二叉樹 //以二叉排序樹的規則建立 /*二級指針寫法 bool addBiNode(BiNode **nodeRoot,T d){ if(*nodeRoot==nullptr){ BiNode *p=new BiNode(d); *nodeRoot=p; cout< data<<" insert success!"< data){ //往左子樹遞歸 addBiNode(&((*nodeRoot)->lchild),d); }else if(*nodeRoot!=nullptr&&d>(*nodeRoot)->data){ //往右子樹遞歸 addBiNode(&((*nodeRoot)->rchild),d); }else{ cout<<"樹中已有該數據"< data<<" insert success!"< data){ //往左子樹遞歸 addBiNode(nodeRoot->lchild,d); }else if(nodeRoot!=nullptr&&d>(nodeRoot)->data){ //往右子樹遞歸 addBiNode(nodeRoot->rchild,d); }else{ cout<<"樹中已有該數據"< data<<" "; } //利用遞歸遍歷,三種遍歷原理都是一樣的 //前序遍歷,先根遍歷 void PreOrderTraverse(const BiNode *nodeRoot)const{ if(nodeRoot!=nullptr) Visit(nodeRoot); if(nodeRoot->lchild!=nullptr) PreOrderTraverse(nodeRoot->lchild); if(nodeRoot->rchild!=nullptr) PreOrderTraverse(nodeRoot->rchild); } //中根遍歷 void InOrderTraverse(const BiNode *nodeRoot)const{ if(nodeRoot->lchild!=nullptr) InOrderTraverse(nodeRoot->lchild); if(nodeRoot!=nullptr)//當該點左子樹空時 Visit(nodeRoot); if(nodeRoot->rchild!=nullptr) InOrderTraverse(nodeRoot->rchild); } //後序遍歷 void PostOrderTraverse(const BiNode *nodeRoot)const{ if(nodeRoot->lchild!=nullptr) PostOrderTraverse(nodeRoot->lchild); if(nodeRoot->rchild!=nullptr) PostOrderTraverse(nodeRoot->rchild); if(nodeRoot!=nullptr) Visit(nodeRoot); } };
int main() { BiTree b; //b.addBiNode(&b.root,50);//設立根節點值//二級指針寫法 b.addBiNode(b.getRoot(),50);//指針的引用寫法 int i; int arr[9]={30,40,35,27,100,90,110,95,-999}; bool flag=true; while(flag) { flag=!flag; //cout<<"請輸入一個數(輸入-999將退出:"; //cin>>i; for(int j=0;j<9;j++) { i=arr[j]; if(i==-999) break; b.addBiNode(b.getRoot(),i); } //b.addBiNode(&b.root,i); } b.Traverse(b.getPtrToRoot(),"PreOrderTraverse"); b.Traverse(b.getPtrToRoot(),"InOrderTraverse"); b.Traverse(b.getPtrToRoot(),"PostOrderTraverse"); cin.get(); system("pause"); return 0; }