#include<iostream> using namespace std; //定義節點 typedef struct node { struct node *lchild; struct node *rchild; int data; }BiTreeNode, *BiTree; //*BiTree的意思是給 struct node*起了個別名,叫BiTree,故BiTree爲指向節點的指針。 //按照前序順序創建二叉樹 void createBiTree(BiTree &T) //&的意思是傳進來節點指針的引用,括號內等價於 BiTreeNode* &T,目的是讓傳遞進來的指針發生改變 { int c; cin >> c; if(0 == c) //當遇到#時,令樹的根節點爲NULL,從而結束該分支的遞歸 T = NULL; else { T = new BiTreeNode; T->data=c; createBiTree(T->lchild); createBiTree(T->rchild); } } bool judgeSortT(BiTree T)//判斷是否爲排序樹 { bool lj; if(!T) return 1; lj=judgeSortT(T->lchild);//左子樹判斷 if(T->lchild && T->lchild->data>T->data) lj=0; if(T->rchild && T->data>T->rchild->data) lj=0; return lj && judgeSortT(T->rchild);//T的左子樹及其當前結點T均符合要求則對右子樹進行判斷 } void dispLeaf(BiTree T,int lev)//顯示葉子結點 { if(T) { dispLeaf(T->lchild,lev+1); if(!T->lchild && !T->rchild) cout<<T->data<<'\t'<<lev<<endl; dispLeaf(T->rchild,lev+1); } } //前序遍歷二叉樹並打印 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<<"排序樹"<<judgeSortT(T)<<endl; dispLeaf(T,1); // cout<<endl; // cout<<"後序遍歷二叉樹:"<<endl; // postTraverse(T); return 0; }