二叉树的用法

来源:互联网 发布:淘宝短连接在线生成 编辑:程序博客网 时间:2024/04/28 09:52

1)用二叉链表作为存储结构;

2)分别按先序,中序和后序遍历二叉树;

3)编写交换二叉树中所有结点左右孩子的非递归算法。

二、实验方案

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define STACK_MAX_SIZE 30

#define QUEUE_MAX_SIZE 30

#ifndef elemType

 typedef char elemType;

#endif

 

 

struct BTreeNode{

 elemType data;

 struct BTreeNode *lchild;

 struct BTreeNode *rchild;

};

/* 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

!= '/0'){

     switch(a

)

{

   case ' ':  break;  /* 对空格不作任何处理 */

   case '(':

    if(top == STACK_MAX_SIZE - 1){

        printf("zhankongjiantaixiao/n");

     exit(1);

    }

    top++;

    s[top] = p;

    k = 1;

    break;

         case ')':

    if(top == -1){

        printf("erchashuguangyibiaozifucuancuowu!/n");

     exit(1);

    }

    top--;

    break;

   case ',':

    k = 2;

    break;

   default:

    p=malloc(sizeof(struct BTreeNode));

    p->data = a

;

    p->lchild = p->rchild = NULL;

    if(*bt==NULL){

     *bt = p;

    }else

 {

     if( k == 1){

     s[top]->lchild = p;

      }else

{

    s[top]->rchild = p;

        }

    }

     }

  i++;  /* 为扫描下一个字符修改i */

 }

 return;

}

 

/* 前序遍历 */

void preOrder(struct BTreeNode *bt)

{

 if(bt != NULL){

     printf("%c ", bt->data);  /* 访问根结点 */

  preOrder(bt->lchild);    /* 前序遍历左子树 */

  preOrder(bt->rchild);   /* 前序遍历右子树 */

 }

 return;

}

 

 

 

 

/* 中序遍历 */

void inOrder(struct BTreeNode *bt)

{

 if(bt != NULL){

  inOrder(bt->lchild);    /* 中序遍历左子树 */

     printf("%c ", bt->data);  /* 访问根结点 */

  inOrder(bt->rchild);    /* 中序遍历右子树 */

 }

 return;

}

/* 后序遍历 */

void postOrder(struct BTreeNode *bt)

{

 if(bt != NULL){

  postOrder(bt->lchild);   /* 后序遍历左子树 */

  postOrder(bt->rchild);   /* 后序遍历右子树 */

  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->lchild != NULL)

{

      rear = (rear + 1) % QUEUE_MAX_SIZE;

   q[rear] = p->lchild;

  }       /* 若结点存在右孩子,则右孩子结点指针进队 */

  if(p->rchild != NULL){

      rear = (rear + 1) % QUEUE_MAX_SIZE;

   q[rear] = p->rchild;

  }

 }

 return;

}

 

void change(struct BTreeNode *bt)

{

 struct BTreeNode *p;

 struct BTreeNode *k;

 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->lchild != NULL&&p->rchild != NULL) /* 若结点存在左孩子,则左孩子结点指针进队 */

  {k=p->lchild;

   p->lchild=p->rchild;

   p->rchild=k;

   rear = (rear + 1) % QUEUE_MAX_SIZE;

   q[rear]=p->lchild;

   rear = (rear + 1) % QUEUE_MAX_SIZE;

   q[rear]=p->rchild;

  }

  else

  if(p->lchild= NULL&&p->rchild!= NULL)

  {

  rear = (rear + 1) % QUEUE_MAX_SIZE;

  q[rear] = p->rchild;

  }

  else

  if(p->rchild= NULL &&p->lchild!= NULL)

  {

   rear = (rear + 1) % QUEUE_MAX_SIZE;

原创粉丝点击