数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

来源:互联网 发布:ios软件助手 编辑:程序博客网 时间:2024/06/12 01:49

数据结构二叉树——

编写函数实现:建立二叉树、中序递归遍历、借助栈实现中序非递归遍历、借助队列实现层次遍历、求高度、结点数、叶子数及交换左右子树。

("."表示空子树)

#include<stdio.h>#include<stdlib.h>//***********二叉树链表节点结构typedef char DataType;typedef struct Node{ DataType data; struct Node*LChild; struct Node*RChild;}BiTNode,*BiTree;void Insert_tree(BiTree *T){ char ch; ch = getchar(); if (ch == '.')//"."表示空子树  *T = NULL; else  {  *T = (BiTree)malloc(sizeof(BiTNode));  (*T)->data = ch;  Insert_tree(&((*T)->LChild));  Insert_tree(&((*T)->RChild)); }}//*************二叉树的中序递归遍历void InOrder(BiTree root){ if (root != NULL) {  InOrder(root->LChild);  printf("%c ",root->data);  InOrder(root->RChild); }}//****************二叉树的中序非递归遍历算法(调用栈操作)#define Stack_Size 50typedef struct //顺序栈结构{ BiTree elem[Stack_Size]; int top;   //用来存放栈顶元素的下标,top为-1表示空栈}SeqStack;void InitStack(SeqStack *S)// 顺序栈初始化{ S->top = -1;  //制造一个空栈}int Push(SeqStack *S, BiTree x)  //顺序进栈{ if (S->top == Stack_Size - 1)  return 0;  //栈已满 S->top++; S->elem[S->top] = x; return 1;}int Pop(SeqStack * S, BiTree *x)//顺序出栈{ if (S->top == -1)  //栈为空  return 0; else {  *x = S->elem[S->top];  S->top--;  return 1; }}int IsEmpty(SeqStack *s){ return s->top == -1 ? 0 : 1;}void InOrder_2(BiTree root)   //二叉树的中序非递归遍历{ BiTree p; SeqStack S; InitStack(&S); p = root; while (p != NULL|| IsEmpty(&S)) {  if (p != NULL)  {   Push(&S, p);   p = p->LChild;  }  else  {   Pop(&S,&p);   if(p != NULL)   printf("%c ", p->data);   p = p->RChild;  } }}//***********************借助队列实现二叉树的层次遍历#define MAXSIZE 50typedef struct{ BiTree element[MAXSIZE]; int front; int rear;}SeqQueue;void InitQueue(SeqQueue *Q)//循环队列初始化{ Q->front = 0; Q->rear = 0;}int EnterQueue(SeqQueue *Q,BiTree x) //循环队列入队{ if ((Q->rear + 1) % MAXSIZE == Q->front)  return 0; Q->element[Q->rear] = x; Q->rear = (Q->rear + 1) % MAXSIZE; return 1;}int IsEmpty_Q(SeqQueue *Q)//判断是否为空{ return(Q->rear == Q->front) ? 0 : 1;}int EeleteQueue(SeqQueue *Q,BiTree *x)  //循环队列出队{ if (Q->front == Q->rear)  return 0; *x = Q->element[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; return 1;}int Layer_Order(BiTree root){ SeqQueue Q; BiTree p; InitQueue(&Q); if (root == NULL)  return 0; EnterQueue(&Q, root); while (IsEmpty_Q(&Q)) {  EeleteQueue(&Q,&p);  printf("%c ", p->data);  if(p->LChild)  EnterQueue(&Q,p->LChild);  if(p->RChild)  EnterQueue(&Q,p->RChild); } return 1;}//***********************二叉树的高度(后序遍历)int PostTreeDepth(BiTree bt){ int hl, hr, max; if (bt != NULL) {  hl = PostTreeDepth(bt->LChild);  hr = PostTreeDepth(bt->RChild);  max = hl > hr ? hl : hr; //使用三目运算符 为书写方便  return (max + 1); } else  return 0;}//***********************二叉树的结点个数int Order(BiTree root){ static int ordercount = 0;//static 定义静态变量,在静态区存储,程序运行结束释放,用于实现在原先基础上加“1”,实现统计数字的效果(与下文运用全局变量目的一致) if (root != NULL) {  ordercount++;  Order(root->LChild);  Order(root->RChild); } return ordercount;}//***********************二叉树的叶子个数int LeafCount = 0;//定义全局变量,它的内存在程序执行完之后才释放,用于实现在原先基础上加“1”,实现统计数字的效果void leaf(BiTree root)  //后序遍历统计叶子结点数目{ //int LeafCount = 0; if (root != NULL) {  leaf(root->LChild);  leaf(root->RChild);  if ((root->LChild == NULL) && (root->RChild == NULL))   LeafCount++; } //return LeafCount;}//***********************交换二叉树每个结点的左子树和右子树void Exchange(BiTree root){ BiTree temp = NULL; if (root != NULL) {  temp = root->LChild;  root->LChild = root->RChild;  root->RChild = temp;  Exchange(root->LChild);  Exchange(root->RChild); }}void menu(){ printf("***********************************************\n"); printf("*                  MENU                       *\n"); printf("***********************************************\n"); printf("* 1.输入字符序列,建立二叉树的二叉链表   *\n"); printf("* 2.二叉树的中序递归遍历                *\n"); printf("* 3.二叉树的中序非递归遍历              *\n"); printf("* 4.借助队列实现二叉树的层次遍历        *\n"); printf("* 5.求二叉树的高度                      *\n"); printf("* 6.求二叉树的结点个数                  *\n"); printf("* 7.求二叉树的叶子个数                  *\n"); printf("* 8.交换二叉树每个结点的左子树和右子树  *\n"); printf("* 0.退出                                *\n"); printf("***********************************************\n"); printf("***********************************************\n"); printf("请输入选择序号:->");}int main(){ int choose = 1; BiTree TT = NULL; while (choose) {  menu();  scanf_s("%d", &choose);  getchar();//为不影响二叉树的输入,将输入缓存中的回车(\n)取出  switch (choose)  {  case 1:   Insert_tree(&TT);   break;  case 2:   InOrder(TT);   printf("\n");   break;  case 3:   InOrder_2(TT);   printf("\n");   break;  case 4:   Layer_Order(TT);   printf("\n");   break;  case 5:   printf("高度 = %d\n",PostTreeDepth(TT));   break;  case 6:   printf("节点个数 = %d \n",Order(TT));   break;  case 7:   leaf(TT);   printf("叶子个数 = %d\n", LeafCount);   break;  case 8:   Exchange(TT);   InOrder(TT);   printf("\n");   break;  default:   break;  } } system("pause"); return 0;}

wKiom1ZYnovBCZaUAABBH6tMzUY685.png

wKiom1ZYnoyDPSEQAAA4oiJsLxE546.png

wKioL1ZYnu2gyBeQAAA8vXmRBmk651.png

wKiom1ZYno3wdp2nAAA2RLmk5y8571.png

wKiom1ZYno3DInoiAAAot-rzufg582.png

wKiom1ZYno7BCmj-AAAoiiUJhEA414.png

wKioL1ZYnu7xLqx4AAAop0JJB98011.png

wKioL1ZYnu_xIEh9AAAoun43vMA904.png


0 0