C語言 二叉樹的鏈式存儲實例
二叉樹的鏈式存儲
實現(xiàn)二叉樹的基本操作:建立、遍歷、計算深度、結(jié)點數(shù)、葉子數(shù)等。
輸入C,先序創(chuàng)建二叉樹,#表示空節(jié)點;
輸入H:計算二叉樹的高度;
輸入L:計算二叉樹的葉子個數(shù);
輸入N:計算二叉樹節(jié)點總個數(shù);
輸入1:先序遍歷二叉樹;
輸入2:中序遍歷二叉樹;
輸入3:后續(xù)遍歷二叉樹;
輸入F:查找值=x的節(jié)點的個數(shù);
輸入P:以縮格文本形式輸出所有節(jié)點。
很簡單就不需要多解釋了,代碼貼上
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; /*二叉樹的鏈式存儲表示*/ typedef char DataType; /*應由用戶定義DataType的實際類型*/ typedef struct node { DataType data; node *lchild, *rchild; /*左右孩子指針*/ } BinTNode; /*結(jié)點類型*/ typedef BinTNode *BinTree; int sum=0; void DisplayBinTree(BinTree T); /*用格文本形式表示二叉樹*/ void CreateBinTree(BinTree *T); /*構(gòu)造二叉鏈表*/ void Preorder(BinTree T); /*前序遍歷二叉樹*/ void Inorder(BinTree T); /*中序遍歷二叉樹*/ void Postorder(BinTree T); /*后序遍歷二叉樹*/ int nodes(BinTree T); /*計算總結(jié)點數(shù)*/ int leafs(BinTree T); /*計算總?cè)~子數(shù)*/ int hight(BinTree T); /*計算二叉樹的高度*/ int find(BinTree T,char x); //查找值=x的節(jié)點的個數(shù); int main() { BinTree T; char flg; while(cin>>flg) switch(flg) { case'C': getchar(); CreateBinTree(&T); cout<<"Created success!"<<endl; break; case'H': cout<<"Height="<<hight(T)<<"."<<endl; break; case'L': cout<<"Leaf="<<leafs(T)<<"."<<endl; break; case'N': cout<<"Nodes="<<nodes(T)<<"."<<endl; break; case'1': printf("Preorder is:"); Preorder(T); cout<<"."<<endl; break; case'2': printf("Inorder is:"); Inorder(T); cout<<"."<<endl; break; case'3': printf("Postorder is:"); Postorder(T); cout<<"."<<endl; break; case'F': char x; int ko; getchar(); cin>>x; ko=find(T,x); cout<<"The count of "<<x<<" is "<<ko<<"."<<endl; break; case'P': cout<<"The tree is:"<<endl; DisplayBinTree(T); break; default: cout<<"輸入有誤,請重新輸入"<<endl; } } /*構(gòu)造二叉鏈表*/ void CreateBinTree(BinTree *T) { char ch; if ((ch=getchar())=='#') *T=NULL; else { /*讀入非空格*/ *T=(BinTNode *)malloc(sizeof(BinTNode));/*生成結(jié)點*/ (*T)->data=ch; CreateBinTree(&(*T)->lchild ); /*構(gòu)造左子樹*/ CreateBinTree(&(*T)->rchild ); /*構(gòu)造右子樹*/ } } /*用縮格文本形式表示二叉樹*/ void DisplayBinTree(BinTree T) { BinTree stack[100],p; int level[100],top,n,i; if (T) { top=1; stack[top]=T; level[top]=0; while(top>0) { p=stack[top]; n=level[top]; for (i=1; i<=n; i++) cout<<" "; printf("%c\n",p->data); top--; if (p->rchild!=NULL) { top++; stack[top]=p->rchild; level[top]=n+2; } if (p->lchild!=NULL) { top++; stack[top]=p->lchild; level[top]=n+2; } } } } /*計算總結(jié)點數(shù)*/ int nodes(BinTree T) { if(T) { if( (T->lchild==NULL)&&(T->rchild==NULL)) return 1; else return nodes(T->lchild)+nodes(T->rchild)+1; } return 0; } /*計算總?cè)~子數(shù)*/ int leafs(BinTree T) { if(T) { if ((T->lchild==NULL)&&(T->rchild==NULL)) return 1; else return leafs(T->lchild)+leafs(T->rchild); } return 0; } /*計算樹的高度*/ int hight(BinTree T) { if(T) { if ((T->lchild==NULL)&&(T->rchild==NULL)) return 1; else if((T->lchild==NULL)&&(T->rchild)) return 1+hight(T->rchild); else if((T->lchild)&&(T->rchild==NULL)) return 1+hight(T->lchild); else return hight(T->lchild)+hight(T->rchild); } return 0; } /*前序遍歷二叉樹*/ void Preorder(BinTree T) { if(T) { printf("%c ",T->data); /*訪問結(jié)點*/ Preorder(T->lchild); Preorder(T->rchild); } } /*中序遍歷二叉樹*/ void Inorder(BinTree T) { if(T) { Inorder(T->lchild); printf("%C ",T->data); Inorder(T->rchild); } } /*后序遍歷二叉樹*/ void Postorder(BinTree T) { if(T) { Postorder(T->lchild); Postorder(T->rchild); printf("%C ",T->data); } } int find(BinTree T,char x) { if(T) { if((T->data)==x) sum++; find(T->lchild,x); find(T->rchild,x); } return sum; }
以上就是二叉樹鏈式存儲的一個小實例,需學習要的同學請參考,謝謝支持
相關(guān)文章
C語言中關(guān)于動態(tài)內(nèi)存分配的詳解
動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。棧上分配的內(nèi)存是由系統(tǒng)分配和釋放的,空間有限,在復合語句或函數(shù)運行結(jié)束后就會被系統(tǒng)自動釋放而堆上分配的內(nèi)存則不會有這個問題。2021-09-09Unity3D實現(xiàn)經(jīng)典小游戲Pacman
這篇文章主要介紹了基于Unity3D制作一做個經(jīng)典小游戲Pacman,文中的示例代碼講解詳細,對我們學習Unity3D有一定的幫助,感興趣的小伙伴可以了解一下2021-12-12C語言實現(xiàn)選擇排序、直接插入排序、冒泡排序的示例
這篇文章主要介紹了C++實現(xiàn)選擇排序、直接插入排序、冒泡排序的代碼示例,相當簡潔直觀,也是算法和數(shù)據(jù)結(jié)構(gòu)學習中的基礎(chǔ),需要的朋友可以參考下2016-02-02VC++中HTControl控制類使用之CHTDlgBase對話框基類實例
這篇文章主要介紹了VC++中HTControl控制類使用之CHTDlgBase對話框基類,是比較豐富而實用的功能,需要的朋友可以參考下2014-08-08