c語言的二叉樹的建立
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 100//定義最大的節點數
//建立二叉樹的型別
typedef struct TNode{
char data;//資料型別
struct TNode *left,*right;
}*BinTree;//定義指標變數
//輸入字串返回二叉連結串列
BinTree cearteTree(char *str){//返回的是一個二叉連結串列
BinTree s[M],b=NULL,p;//初始棧,初始化root指標,定義一個用來建立的指標
int top=-1,i=0,flag=1;//原始棧為空,定義標誌位flag=1
while(str[i]!='\0'){//字串遍歷完成
if(str[i]!='#'){
p=(BinTree)malloc(sizeof ( struct TNode));//如果不是#申請儲存空間
p->data=str[i];//為當前的資料賦值
p->left=p->right=NULL;//初始話左右指標
if(b==NULL){//判斷是否有雙親節點
b=p;
}else{
switch(flag){
case 1:s[top]->left=p;break;//使雙親節點的左指標指向當前的指標
case 2:s[top]->right=p;top--;break;//使雙親節點的左指標指向當前的指標,雙親節點出戰
}
}
top++;//指標後移
s[top]=p;//將當前的值入棧
flag=1;//重新整理當前的flag
}else{
flag=2;//標記為右指標
if(str[i-1]=='#'){//若上一個是#代表左右都是空
top--;//指標後移
}
}
i++;//字元元素後移
}
return b;//最後返回根節點b
}
//先序遍歷,底層為遞迴演算法
void preorder(BinTree b){
if(b==NULL){
return ;
}else{
printf("%-5c",b->data);//輸出對應的結果
preorder(b->left);//向左遞迴查詢
preorder(b->right);//向右遞迴查詢
}
}
//中序遍歷,底層為遞迴演算法
void center(BinTree b){
if(b==NULL){
return ;
}else{
preorder(b->left);//向左遞迴查詢
printf("%-5c",b->data);//輸出對應的結果
preorder(b->right);//向右遞迴查詢
}
}
//後序遍歷,底層為遞迴演算法
void finall(BinTree b){
if(b==NULL){
return ;
}else{
preorder(b->left);//向左遞迴查詢
preorder(b->right);//向右遞迴查詢
printf("%-5c",b->data);//輸出對應的結果
}
}
int main(){
char s[M];//定義一個最大大小的字元陣列
BinTree b;//定義一個二叉樹的頭指標b
gets(s);//得到輸入的字串
b=cearteTree(s);//建立二叉樹
preorder(b);//先序遍歷
printf("\n");
center(b);//中序遍歷
printf("\n");
finall(b);//後序遍歷
printf("\n");
return 0;
}
#include<string.h>
#include<stdlib.h>
#define M 100//定義最大的節點數
//建立二叉樹的型別
typedef struct TNode{
char data;//資料型別
struct TNode *left,*right;
}*BinTree;//定義指標變數
//輸入字串返回二叉連結串列
BinTree cearteTree(char *str){//返回的是一個二叉連結串列
BinTree s[M],b=NULL,p;//初始棧,初始化root指標,定義一個用來建立的指標
int top=-1,i=0,flag=1;//原始棧為空,定義標誌位flag=1
while(str[i]!='\0'){//字串遍歷完成
if(str[i]!='#'){
p=(BinTree)malloc(sizeof ( struct TNode));//如果不是#申請儲存空間
p->data=str[i];//為當前的資料賦值
p->left=p->right=NULL;//初始話左右指標
if(b==NULL){//判斷是否有雙親節點
b=p;
}else{
switch(flag){
case 1:s[top]->left=p;break;//使雙親節點的左指標指向當前的指標
case 2:s[top]->right=p;top--;break;//使雙親節點的左指標指向當前的指標,雙親節點出戰
}
}
top++;//指標後移
s[top]=p;//將當前的值入棧
flag=1;//重新整理當前的flag
}else{
flag=2;//標記為右指標
if(str[i-1]=='#'){//若上一個是#代表左右都是空
top--;//指標後移
}
}
i++;//字元元素後移
}
return b;//最後返回根節點b
}
//先序遍歷,底層為遞迴演算法
void preorder(BinTree b){
if(b==NULL){
return ;
}else{
printf("%-5c",b->data);//輸出對應的結果
preorder(b->left);//向左遞迴查詢
preorder(b->right);//向右遞迴查詢
}
}
//中序遍歷,底層為遞迴演算法
void center(BinTree b){
if(b==NULL){
return ;
}else{
preorder(b->left);//向左遞迴查詢
printf("%-5c",b->data);//輸出對應的結果
preorder(b->right);//向右遞迴查詢
}
}
//後序遍歷,底層為遞迴演算法
void finall(BinTree b){
if(b==NULL){
return ;
}else{
preorder(b->left);//向左遞迴查詢
preorder(b->right);//向右遞迴查詢
printf("%-5c",b->data);//輸出對應的結果
}
}
int main(){
char s[M];//定義一個最大大小的字元陣列
BinTree b;//定義一個二叉樹的頭指標b
gets(s);//得到輸入的字串
b=cearteTree(s);//建立二叉樹
preorder(b);//先序遍歷
printf("\n");
center(b);//中序遍歷
printf("\n");
finall(b);//後序遍歷
printf("\n");
return 0;
}
相關文章
- 二叉樹 C語言二叉樹C語言
- C語言 遞迴實現二叉排序樹的插入C語言遞迴排序
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 資料結構實驗:二叉樹的遍歷(C語言版)資料結構二叉樹C語言
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- java語言實現二叉樹Java二叉樹
- 資料結構-二叉樹的遍歷(類C語言描寫敘述)資料結構二叉樹C語言
- 二叉樹的構建以及遍歷(Java語言描述)二叉樹Java
- 二叉樹 & 二叉查詢樹 ADT【資料結構與演算法分析 c 語言描述】二叉樹資料結構演算法
- 二叉樹 & 二叉查詢樹 ADT [資料結構與演算法分析 c 語言描述]二叉樹資料結構演算法
- 二叉樹的建立與遍歷二叉樹
- C語言建立核心容器C語言
- 資料結構(C語言版)第2版------第五章 樹與二叉樹資料結構C語言二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 線索二叉樹的原理及建立二叉樹
- C語言 編寫線段樹C語言
- C/C++ 二叉樹C++二叉樹
- 資料結構之二叉樹的建立資料結構二叉樹
- 【資料結構】建立二叉樹的方法資料結構二叉樹
- 二叉樹的子樹和子結構 c++二叉樹C++
- C++樹——遍歷二叉樹C++二叉樹
- 二叉樹的建立及遍歷(JavaScript實現)二叉樹JavaScript
- C語言的HelloWorldC語言
- AVL樹(查詢、插入、刪除)——C語言C語言
- 劍指offer——二叉樹的映象C++二叉樹C++
- 劍指offer——二叉樹的深度C++二叉樹C++
- 二叉查詢樹的實現——C++C++
- go語言與c語言的相互呼叫GoC語言
- C語言與嵌入式C語言的區別C語言
- Swift多語言版本的建立Swift
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴
- 中序線索二叉樹的建立與遍歷二叉樹
- 【資料結構】二叉樹的建立與遍歷資料結構二叉樹
- 二叉樹的建立、遍歷、廣義錶轉換二叉樹
- 二叉樹的建立,插入,查詢,清空和比較二叉樹
- 建立一棵二叉排序樹排序
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- Kotlin 鏈式儲存的二叉樹的建立、遍歷Kotlin二叉樹