二叉樹的建立(不使用類),查詢,求樹高
阿新 • • 發佈:2018-12-28
<程式碼>
#include<iostream> #include<queue> using namespace std; //建立節點 struct Tnode { char data;//資料域 Tnode *rchild;//右孩子 Tnode *lchild;//左孩子 }; //建立二叉樹 void CreatTree(Tnode *&T)//遞迴建樹 { char a; cin>>a; if(a!='#')//#號表示為空 { T=new Tnode();//加小括號的作用<分配記憶體並初始化>,去之會產生野指標 T->data=a; CreatTree(T->lchild);//生成左子樹 CreatTree(T->rchild);//生成右子樹 } } //前序遍歷 void PreOder(Tnode *root) { if(root) { cout<<root->data<<" ";//輸出父親節點 PreOder(root->lchild);//輸出左子樹 PreOder(root->rchild);//輸出右子樹 } } //中序遍歷 void InOder(Tnode *root) { if(root) { InOder(root->lchild); cout<<root->data<<" "; InOder(root->rchild); } } //後序遍歷 void PosOder(Tnode *root) { if(root) { PosOder(root->lchild); PosOder(root->rchild); cout<<root->data<<" "; } } //層序遍歷 //採用佇列輸出一節點的同時將其左右孩子入隊,重複操作直至佇列為空 void LeverOder(Tnode *root) { if(root) { queue<Tnode*> Q; Q.push(root); while(!Q.empty()) { Tnode *q=Q.front(); Q.pop(); cout<<q->data<<" "; if(q->lchild!=NULL) Q.push(q->lchild); if(q->rchild!=NULL) Q.push(q->rchild); } } } //樹高 int Depth(Tnode *root) { if(root==NULL) return 0; int ldeep=Depth(root->lchild)+1;//計算左子樹高度並加1 int rdeep=Depth(root->rchild)+1;//計算右子樹高度並加1 return ldeep>rdeep?ldeep:rdeep;//返回最大高度 } //中序查詢節點 Tnode *InOderSearch(Tnode *root,char s) { if(root) { if(s==root->data) return root;//節點即為所找 Tnode *l=NULL; l=InOderSearch(root->lchild,s);//在左子樹上查詢 if(l) return l; Tnode *r=NULL; r=InOderSearch(root->rchild,s);//在右子樹上查詢 if(r) return r; if(!l&&!r) return NULL;//不存在s } } //查詢葉子節點 void searchLeaf(Tnode *r) { if(r) { if(!r->lchild&&!r->lchild) cout<<r->data<<" ";//如果左右子樹為空則輸出節點 else { searchLeaf(r->lchild);//遍歷左子樹 searchLeaf(r->rchild);//遍歷右子樹 } } } //main函式 int main() { Tnode *Root=NULL; Tnode *p=NULL; char d; CreatTree(Root); cout<<endl<<"前序遍歷:"; PreOder(Root); cout<<endl<<"中序遍歷:"; InOder(Root); cout<<endl<<"後序遍歷:"; PosOder(Root); cout<<endl<<"層序遍歷:"; LeverOder(Root); cout<<endl<<"樹高:"; cout<<Depth(Root); cout<<endl<<"輸出葉子節點:"; searchLeaf(Root); cout<<endl<<"輸入要查詢的節點:"; cin>>d; p=InOderSearch(Root,d); if(p) cout<<"Yes"<<endl;//查詢成功 else cout<<"No"<<endl;//查詢失敗 return 0; }
截圖: