数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
来源:互联网 发布: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;}
0 0
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历
- 二叉树遍历(层次,递归,非递归)
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- 二叉树遍历——层次遍历、前中后序遍历(递归、非递归)
- 二叉树建立、递归、非递归遍历
- java数据结构--二叉树,递归遍历,非递归遍历,层次遍历
- 【数据结构】二叉树的定义,递归遍历,非递归遍历,层次遍历,深度等
- 二叉树的前序中序后序遍历,非递归遍历 层次遍历
- 二叉树(前中后序递归非递归遍历,层次遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 非递归按层次遍历二叉树
- 非递归二叉树层次遍历算法
- 二叉树的非递归层次遍历
- 二叉树非递归层次遍历
- 二叉树非递归遍历之层次遍历,先序、中序遍历
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 二叉树的建立及层次遍历及前中后序遍历递归与非递归的实现
- 用C编程实现打印杨辉三角
- C语言头文件的写作方法和说明
- Hanoi(汉诺)塔问题(C实现)
- 笔试面试成对出现的一组数,只有一个或两个只出现一次的数字,找到它们。
- <笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- 通讯录小程序(C/C++)C语言练习小程序
- uva 129 Krypton Factor
- 最全顺序表函数(打印,初始化,后插,后删,前插,前删……)
- #pragma once和#ifndef的区别
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- C/C++,数据结构单链表(采用C++"引用"方法)(寻找节点、在某处插入结点、删除某位置结点)
- PCA学习
- 遗传算法与TSP问题的MATLAB实现