把常式敲一遍 才對二叉樹有了個基本的認識
完整正確常式:
#include <iostream>#include<stdlib.h>using namespace std;//二叉樹出的二叉鏈表結構定義struct bitnode{ char data; bitnode *lchild,*rchild;};bitnode *t;//bitree==*bitnode//前序走訪遞迴void preordertraverse(bitnode *t){ if(t==NULL) return ; cout<<t->data; preordertraverse(t->lchild); preordertraverse(t->rchild);}//二叉樹的中序遍曆遞迴void inordertraverse(bitnode *t){ if(t==NULL) return ; inordertraverse(t->lchild); cout<<t->data; inordertraverse(t->rchild);}//二叉樹後序遍曆遞迴void postordertraverse(bitnode *t){ if(t==NULL) return ; postordertraverse(t->lchild); postordertraverse(t->rchild); cout<<t->data;}//按前序輸入二叉樹中結點的值(一個字元)//#表示空樹,構造二叉鏈表表示二叉樹t《大話資料結構》void createbitree(bitnode *(*t)){ char ch; cin>>ch; if(ch=='#') (*t)=NULL; else { (*t)=new bitnode; //if(!t) // exit(0); (*t)->data=ch; createbitree(&(*t)->lchild);//構造左子樹 createbitree(&(*t)->rchild);//構造右子樹 }}int main(){cout<<"請輸入全部結點(null 指標用#代替):"<<endl; createbitree(&t);cout<<"\n\n先序遍曆"<<endl;inordertraverse(t);cout<<"\n中序遍曆"<<endl; preordertraverse(t);cout<<"\n後序遍曆"<<endl;postordertraverse(t); cout<<endl; return 0;}
下面是運行結果:
錯誤的建樹函數:
錯誤原因是:參數有單向傳遞的特點,修改後的data無法傳遞到主函數中
void createbitree(bitnode *t){ char ch; cin>>ch; if(ch=='#') t=NULL; else { t=new bitnode; //if(!t) // exit(0); t->data=ch; createbitree(t->lchild);//構造左子樹 createbitree(t->rchild);//構造右子樹 }}*/
修改指標的值:二級指標,引用,傳回值(返回修改後的指標)
////////////////////1傳引用///////////////////////////// /*在主函數中定義樹,然後傳到createbitree中void createbitree(bitnode &t){ char ch; cin>>ch; if(ch=='#') t=NULL; else { t=new bitnode; //if(!t) // exit(0); t->data=ch; createbitree(t->lchild);//構造左子樹 createbitree(t->rchild);//構造右子樹 }}main函數中改為:createbitree(t); 2 //////////////////傳回值////////////////////////////////: /*直接在函數中定義樹;bitnode * createbitree(){ bitnode *t; char ch; cin>>ch; if(ch=='#') t=NULL; else { t=new bitnode; //if(!t) // exit(0); t->data=ch; createbitree(t->lchild);//構造左子樹 createbitree(t->rchild);//構造右子樹 } return t;} 主函數:createbitree();*///按前序輸入二叉樹中結點的值(一個字元)//#表示空樹,構造二叉鏈表表示二叉樹t《大話資料結構》void createbitree(bitnode *(*t)){ char ch; cin>>ch; if(ch=='#') (*t)=NULL; else { (*t)=new bitnode; //if(!t) // exit(0); (*t)->data=ch; createbitree(&(*t)->lchild);//構造左子樹 createbitree(&(*t)->rchild);//構造右子樹 }}