⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianli.cpp

📁 数据结构
💻 CPP
字号:
#include <iostream.h> 
#include <stdlib.h>
#include <stdio.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType;
#endif

struct BTreeNode
{
elemType data;
struct BTreeNode *left;
struct BTreeNode *right;
};

/* 初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return;
}

/* 建立二叉树(根据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)
	 {
         printf("栈空间太小!\n");
      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 = (BTreeNode *)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;
}

/* 检查二叉树是否为空,为空则返回1,否则返回0 */
int emptyBTree(struct BTreeNode *bt)
{
if(bt == NULL){
      return 1;
}else{
      return 0;
}
}

/*输出二叉树(前序遍历) */
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;
}

/*清除二叉树,使之变为一棵空树 */
void clearBTree(struct BTreeNode* *bt)
{
if(*bt != NULL){
      clearBTree(&((*bt)->left));
   clearBTree(&((*bt)->right));
   free(*bt);
   *bt = NULL;
}
return;
}

/* 前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
      printf("%c ", bt->data);   /* 访问根结点 */
   preOrder(bt->left);     /* 前序遍历左子树 */
   preOrder(bt->right);    /* 前序遍历右子树 */
}
return;
}


/* 前序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
   inOrder(bt->left);     /* 中序遍历左子树 */
      printf("%c ", bt->data);   /* 访问根结点 */
   inOrder(bt->right);     /* 中序遍历右子树 */
}
return;
}

/* 后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
   postOrder(bt->left);    /* 后序遍历左子树 */
   postOrder(bt->right);    /* 后序遍历右子树 */
   printf("%c ", bt->data);   /* 访问根结点 */
}
return;
}

/* 按层遍历 */
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");
      clearBTree(&bt);
      return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -