簡述:
二叉樹是十分重要的數據結構,主要用來存放數據,並且方便查找等操作,在很多地方有廣泛的應用。
二叉樹有很多種類,比如線索二叉樹,二叉排序樹,平衡二叉樹等,本文寫的是最基礎最簡單的二叉樹。
思路:
二叉樹的建立采用的是遞歸的思想:給定一個指向根節點的指針,然后遞歸調用ceate()函數,自動生成一個二叉樹。就像是在地上挖了個坑(根節點),然后他會拿着鏟子(create函數)按照一定的規則自動挖一個很大的洞穴(二叉樹)出來。當然挖坑前需要先定義每個洞長什么樣(定義節點結構)。
二叉樹的遍歷采用的也是遞歸的思想:如果節點有數據,則按照遍歷規則打印根節點和孩子節點,沒有數據則返回直到所有數據都遍歷完,遞歸結束。
不廢話,上代碼:
#include<iostream> using namespace std; //定義節點 typedef struct node { struct node *lchild; struct node *rchild; char data; }BiTreeNode, *BiTree; //*BiTree的意思是給 struct node*起了個別名,叫BiTree,故BiTree為指向節點的指針。 //按照前序順序建立二叉樹 void createBiTree(BiTree &T) //&的意思是傳進來節點指針的引用,括號內等價於 BiTreeNode* &T,目的是讓傳遞進來的指針發生改變 { char c; cin >> c; if('#' == c) //當遇到#時,令樹的根節點為NULL,從而結束該分支的遞歸 T = NULL; else { T = new BiTreeNode; T->data=c; createBiTree(T->lchild); createBiTree(T->rchild); } } //前序遍歷二叉樹並打印 void preTraverse(BiTree T) { if(T) { cout<<T->data<<" "; preTraverse(T->lchild); preTraverse(T->rchild); } } //中序遍歷二叉樹並打印 void midTraverse(BiTree T) { if(T) { midTraverse(T->lchild); cout<<T->data<<" "; midTraverse(T->rchild); } } //后續遍歷二叉樹並打印 void postTraverse(BiTree T) { if(T) { postTraverse(T->lchild); postTraverse(T->rchild); cout<<T->data<<" "; } } int main() { BiTree T; //聲明一個指向二叉樹根節點的指針 createBiTree(T); cout<<"二叉樹創建完成!"<<endl; cout<<"前序遍歷二叉樹:"<<endl; preTraverse(T); cout<<endl; cout<<"中序遍歷二叉樹:"<<endl; midTraverse(T); cout<<endl; cout<<"后序遍歷二叉樹:"<<endl; postTraverse(T); return 0; }
測試結果:
假設我們要建立一個如下圖所示的二叉樹,#代表空節點,按照前序遍歷順序二叉樹表示為:ab##c##
. 
下面是代碼的運行結果,正如預期:

