二叉樹的鏈式儲存及其部分函式實現
阿新 • • 發佈:2018-11-15
題意
實現二叉樹的鏈式儲存和部分的函式
思路
這是一個鏈式儲存實現的二叉樹。首先 是構造了一個名為 node 的 二叉樹資料結構內有(1)char 變數,(2)兩個指向其本身的結構體指標變數 lch,rch.然後 用typedef分別給 node結構體起了一個Bn的別名和給 node* 起了一個Bt 的別名方便後面程式碼的使用。Bn和Bt分別是代表二叉樹節點 型別和二叉樹節點指標。在主函式裡先定義了一個結構體指標(node *) 型別的變數 head,這個結構體指標變數 head是我們要構造的二叉樹的根結點;(變數的本質是在記憶體中開闢一塊空間,這塊空間在記憶體中有相應的地址,而空間裡存放我們要存放的資料。)在 cbtree函式裡頭 形參 是( Bt &T) 意思是定義了一個結構體指標變數 T ,而 T前面的 & 起到了一個引用傳遞(意思是呼叫函式cbtree時引用了head變數)的作用。cbtree函式內部是一個先序構造二叉樹的操作,前面已說明是在head上進行操作則在呼叫cbtree函式的開始就是對 head 結點的操作 。輸入date 資料 c如果c是' , ' 則變數T(這步操作是變數head為空,接下來的遞迴操作就是具體的樹的左右分支結點為空)就為空,否則進行 T=new Bn(T=new Bn,申請一塊該型別空間,並把地址返回,藉此完成了結構體指標變數的初始化)並把 c 的值賦給T->date(這步操作是把 c 的值賦給結構體指標變數head的,接下來的遞迴操作就是給具體的樹的左右分支結點賦值),接下來就是遞迴操作實現左右子樹的構建。
code
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; typedef struct node { char date; node *lch,*rch;// 在結構體中定義指標型的左子樹和右子樹 }Bn,*Bt; // Bn 代表結點 *Bt代表根節點 void cbtree(Bt &T) // 先序建二叉樹 { char c; scanf("%c",&c); if(c==',') T=NULL; else { T=new Bn; T->date=c; cbtree(T->lch); cbtree(T->rch); } return ; } void pre(Bt T) //先序遍歷二叉樹 { if(T) { printf("%c",T->date); pre(T->lch); pre(T->rch); } } void in(Bt T) //中序遍歷二叉樹 { if(T) { in(T->lch); printf("%c",T->date); in(T->rch); } } void post(Bt T) //後序遍歷二叉樹 { if(T) { post(T->lch); post(T->rch); printf("%c",T->date); } } void level(Bt T) //層次遍歷二叉樹 { queue<Bn> Q; Q.push(*T); while(!Q.empty()) { Bn next=Q.front(); Q.pop(); printf("%c",next.date); if(next.lch) Q.push(*(next.lch)); if(next.rch) Q.push(*(next.rch)); } } int cnt=0; void cntleaf1(Bt T) //求葉子節點 { if(T) { if(!T->lch&&!T->rch) { cnt++; return ; } cntleaf1(T->lch); cntleaf1(T->rch); } } int cntleaf2(Bt T) //求葉子節點 { if(!T) return 0; if(!T->lch&&!T->rch) return 1; else { int n1=cntleaf2(T->lch); int nr=cntleaf2(T->rch); return n1+nr; } } int dep(Bt T) //求二叉樹的深度 { int ddep=0; if(!T) return ddep; int n1=dep(T->lch); int nr=dep(T->rch); return (n1>nr ? n1:nr)+1 ; } int main() { Bt head; cbtree(head); // 先序遍歷二叉樹 pre(head); printf("\n"); in(head); // 中序遍歷二叉樹 printf("\n"); post(head); // 後序遍歷二叉樹 printf("\n"); level(head); // 層次遍歷二叉樹 printf("\n"); cntleaf1(head); // 求二叉樹的葉子節點 printf("%d\n",cnt); printf("%d\n",cntleaf2(head)); // 求二叉樹深度 printf("%d\n",dep(head)); }