国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據結構C語言實現系列——二叉樹

2019-11-17 05:01:54
字體:
來源:轉載
供稿:網友
Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
 typedef char elemType;
#endif
/************************************************************************/
/*                      以下是關于二叉樹操作的11個簡單算法               */
/************************************************************************/
strUCt BTreeNode{
 elemType data;
 struct BTreeNode *left;
 struct BTreeNode *right;
};/* 1.初始化二叉樹 */
void initBTree(struct BTreeNode* *bt)
{
 *bt = NULL;
 return;
}/* 2.建立二叉樹(根據a所指向的二叉樹廣義表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
 struct BTreeNode *p;
 struct BTreeNode *s[STACK_MAX_SIZE];/* 定義s數組為存儲根結點指針的棧使用 */
 int top = -1; /* 定義top作為s棧的棧頂指針,初值為-1,表示空棧 */
 int k; /* 用k作為處理結點的左子樹和右子樹,k = 1處理左子樹,k = 2處理右子樹 */
 int i = 0; /* 用i掃描數組a中存儲的二叉樹廣義表字符串,初值為0 */
 *bt = NULL; /* 把樹根指針置為空,即從空樹開始建立二叉樹 */
 /* 每循環一次處理一個字符,直到掃描到字符串結束符/0為止 */
 while(a[i] != '/0'){
     switch(a[i]){
         case ' ':
    break;  /* 對空格不作任何處理 */
   case '(':
    if(top == STACK_MAX_SIZE - 1){
             exit(1);
    }
    top++;
    s[top] = p;
    k = 1;
    break;
         case ')':
    if(top == -1){
        printf("二叉樹廣義表字符串錯誤!/n");
     exit(1);
    }
    top--;
    break;
   case ',':
    k = 2;
    break;
   default:

    p = malloc(sizeof(struct BTreeNode));
    p->data = a[i];
    p->left = p->right = NULL;
    if(*bt == NULL){
     *bt = p;
    }else{
        if( k == 1){
            s[top]->left = p;
        }else{
            s[top]->right = p;
        }
    }
     }
  i++;  /* 為掃描下一個字符修改i值 */
 }
 return;
}/* 3.檢查二叉樹是否為空,為空則返回1,否則返回0 */
int emptyBTree(struct BTreeNode *bt)
{
 if(bt == NULL){
     return 1;
 }else{
     return 0;
 }
}/* 4.求二叉樹深度 */
int BTreeDepth(struct BTreeNode *bt)
{
 if(bt == NULL){
     return 0;  /* 對于空樹,返回0結束遞歸 */
 }else{
     int dep1 = BTreeDepth(bt->left);  /* 計算左子樹的深度 */
  int dep2 = BTreeDepth(bt->right);  /* 計算右子樹的深度 */
  if(dep1 > dep2){
      return dep1 + 1;
  }else{
      return dep2 + 1;
  }
 }
}/* 5.從二叉樹中查找值為x的結點,若存在則返回元素存儲位置,否則返回空值 */
elemType *findBTree(struct BTreeNode *bt, elemType x)
{
 if(bt == NULL){
     return NULL;
 }else{
     if(bt->data == x){
         return &(bt->data);
     }else{ /* 分別向左右子樹遞歸查找 */
         elemType *p;
   if(p = findBTree(bt->left, x)){
       return p;
   }
   if(p = findBTree(bt->right, x)){
       return p;
   }
   return NULL;
     }
 }
}/* 6.輸出二叉樹(前序遍歷) */
void printBTree(struct BTreeNode *bt)
{
 /* 樹為空時結束遞歸,否則執行如下操作 */
 if(bt != NULL){
     printf("%c", bt->data);  /* 輸出根結點的值 */ 
  if(bt->left != NULL bt->right != NULL){
   printf("(");
   printBTree(bt->left);
   if(bt->right != NULL){
       printf(",");
   }
   printBTree(bt->right);
   printf(")");
  }  
 }
 return;
}/* 7.清除二叉樹,使之變為一棵空樹 */
void clearBTree(struct BTreeNode* *bt)

{
 if(*bt != NULL){
     clearBTree(&((*bt)->left));
  clearBTree(&((*bt)->right));
  free(*bt);
  *bt = NULL;
 }
 return;
}/* 8.前序遍歷 */
void preOrder(struct BTreeNode *bt)
{
 if(bt != NULL){
     printf("%c ", bt->data);  /* 訪問根結點 */
  preOrder(bt->left);    /* 前序遍歷左子樹 */
  preOrder(bt->right);   /* 前序遍歷右子樹 */
 }
 return;
}
/* 9.前序遍歷 */
void inOrder(struct BTreeNode *bt)
{
 if(bt != NULL){
  inOrder(bt->left);    /* 中序遍歷左子樹 */
     printf("%c ", bt->data);  /* 訪問根結點 */
  inOrder(bt->right);    /* 中序遍歷右子樹 */
 }
 return;
}/* 10.后序遍歷 */
void postOrder(struct BTreeNode *bt)
{
 if(bt != NULL){
  postOrder(bt->left);   /* 后序遍歷左子樹 */
  postOrder(bt->right);   /* 后序遍歷右子樹 */
  printf("%c ", bt->data);  /* 訪問根結點 */
 }
 return;
}/* 11.按層遍歷 */
void levelOrder(struct BTreeNode *bt)
{
 struct BTreeNode *p;
 struct BTreeNode *q[QUEUE_MAX_SIZE];
 int front = 0, rear = 0;
 /* 將樹根指針進隊 */
 if(bt != NULL){
     rear = (rear + 1) % QUEUE_MAX_SIZE;
  q[rear] = bt;
 }
 while(front != rear){  /* 隊列非空 */
     front = (front + 1) % QUEUE_MAX_SIZE; /* 使隊首指針指向隊首元素 */
  p = q[front];
  printf("%c ", p->data);
  /* 若結點存在左孩子,則左孩子結點指針進隊 */
  if(p->left != NULL){
      rear = (rear + 1) % QUEUE_MAX_SIZE;
   q[rear] = p->left;
  }
  /* 若結點存在右孩子,則右孩子結點指針進隊 */
  if(p->right != NULL){
      rear = (rear + 1) % QUEUE_MAX_SIZE;
   q[rear] = p->right;
  }
 }
 return;
}/************************************************************************//*
int main(int argc, char *argv[])
{
 struct BTreeNode *bt; /* 指向二叉樹根結點的指針 */
 char *b;    /* 用于存入二叉樹廣義表的字符串 */
 elemType x, *px;
 initBTree(&bt);
 printf("輸入二叉樹廣義表的字符串:/n");
 /* scanf("%s", b); */
 b = "a(b(c), d(e(f, g), h(, i)))";
 createBTree(&bt, b);
 if(bt != NULL)
 printf(" %c ", bt->data);
 printf("以廣義表的形式輸出:/n");
 printBTree(bt);   /* 以廣義表的形式輸出二叉樹 */
 printf("/n");
 printf("前序:");  /* 前序遍歷 */

 preOrder(bt);
 printf("/n");
 printf("中序:");  /* 中序遍歷 */
 inOrder(bt);
 printf("/n");
 printf("后序:");  /* 后序遍歷 */
 postOrder(bt);
 printf("/n");
 printf("按層:");  /* 按層遍歷 */
 levelOrder(bt);
 printf("/n");
 /* 從二叉樹中查找一個元素結點 */
 printf("輸入一個待查找的字符:/n");
 scanf(" %c", &x);  /* 格式串中的空格跳過空白字符 */
 px = findBTree(bt, x);
 if(px){
     printf("查找成功:%c/n", *px);
 }else{
     printf("查找失敗!/n");
 }
 printf("二叉樹的深度為:");
 printf("%d/n", BTreeDepth(bt));
 clearBTree(&bt);
 return 0;
}
*/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 咸阳市| 勐海县| 辽源市| 秀山| 龙南县| 高邑县| 宝鸡市| 七台河市| 临泽县| 来安县| 淅川县| 霍山县| 太仓市| 西丰县| 龙门县| 小金县| 峨边| 合川市| 桂林市| 弋阳县| 民丰县| 荔浦县| 江口县| 吉安市| 墨竹工卡县| 镇沅| 巴彦淖尔市| 阳高县| 建昌县| 乌拉特后旗| 若尔盖县| 陈巴尔虎旗| 福清市| 深圳市| 龙海市| 马边| 大连市| 隆昌县| 石城县| 龙游县| 迭部县|