二叉树的相关操作:创建、查找、求高度和深度、各种遍历(前、中、后、层序)等等
来源:互联网 发布:淘宝运费险咨询电话 编辑:程序博客网 时间:2024/05/01 08:30
#include <stdio.h>#include <stdlib.h>typedef struct BTree{ struct BTree *lchild,*rchild; char item;}BTree,*Tree; //BTree内存:两个指针(各占4字节),一个char类型参数(1字节)typedef struct Queue{ int Front,rear; BTree *bt[10];}Queue;Tree BTcreat(); //二叉树的创建int BThigh(Tree );//二叉树的高度=深度+1int BTnode(Tree ); //统计二叉树中全部结点个数int BTleafnode(Tree ); //统计二叉树中叶结点个数int BTsearch(Tree ,char ); //1:有元素 0:树中无此元素Tree BTsearch1(Tree ,char ); //返回此元素结点int shortestpath(Tree );//输出最短路径长度(根结点到叶结点)void traverse(Tree ,int );//int 取0(前序)1(中序)2(后序)递归程序void laytraverse(Tree );//用队列(头部删除,尾部插入属于先进先出)结构实现int BTequal(Tree ,Tree );//判断两棵树是否相等(1:相等,0:不等)void exchange(Tree );//将二叉树的左右子节点交换int check(Tree ,Tree );//判断两个节点是否相等int symmetry(Tree );//判断二叉树是否对称(与其“镜像”一样)int main(){ printf("Creat a new Binary Tree:\n"); BTree *bt = BTcreat(); printf("The pre-traverse:\n"); traverse(bt,0); printf("\n"); printf("The indix-traverse:\n"); traverse(bt,1); printf("\n"); printf("The post-traverse:\n"); traverse(bt,2); printf("\n"); int h = BThigh(bt); int dp = h-1; printf("The high of the Binary Tree is %d.\n",h); printf("The depth of the Binary Tree is %d.\n",dp); int cnt_node = BTnode(bt); printf("The node number of the Binary Tree is %d.\n",cnt_node); printf("Input the char to be searched: "); char ch; scanf("%c",&ch); int k = BTsearch(bt,ch); if(k) printf("%c is in the Binary Tree.\n",ch); else printf("No %c!\n",ch); printf("The lay-traverse:\n"); laytraverse(bt); printf("\n"); BTree *st = bt; if(BTequal(bt,st)) printf("bt and st are equal!\n"); else printf("bt and st are NOT equal!\n"); int len = shortestpath(bt); printf("The shortest path length is:%d\n",len); if(symmetry(bt)) printf("The Binary Tree is symmetric!\n"); else printf("NO symmetric!\n"); exchange(st); traverse(st,0); return 0;}Tree BTcreat(){ BTree *bt; char ch; scanf(" %c",&ch); if(ch == '#') return NULL; else { bt = malloc(sizeof(*bt)); bt->item = ch; printf("Input the left child:\n"); bt->lchild = BTcreat(); printf("Input the right child:\n"); bt->rchild = BTcreat(); } return bt;}void traverse(Tree bt,int k){ switch(k) {case 0: if(bt == NULL) return; else { printf("%c ",bt->item); if(bt->lchild != NULL) traverse(bt->lchild,0); if(bt->rchild != NULL) traverse(bt->rchild,0); } break;case 1: if(bt == NULL) return; else { if(bt->lchild != NULL) traverse(bt->lchild,1); printf("%c ",bt->item); if(bt->rchild != NULL) traverse(bt->rchild,1); } break;case 2: if(bt == NULL) return; else { if(bt->lchild != NULL) traverse(bt->lchild,2); if(bt->rchild != NULL) traverse(bt->rchild,2); printf("%c ",bt->item); } break; }}int BThigh(Tree st){ int hl,hr; if(st == NULL) return 0; else { hl = BThigh(st->lchild)+1; hr = BThigh(st->rchild)+1; if(hl > hr) return hl; else return hr; }}int BTnode(Tree st){ int cnt; if(st == NULL) return 0; else { cnt = BTnode(st->lchild)+BTnode(st->rchild)+1; return cnt; }}int BTleafnode(Tree st){ int cnt; if(st == NULL) return 0; else { if(st->lchild == NULL && st->rchild == NULL) cnt = BTleafnode(st->lchild)+BTleafnode(st->rchild)+1; return cnt; }}int BTsearch(Tree st,char ch){ if(st == NULL) return 0; else { if(st->item == ch) return 1; else { int k = BTsearch(st->lchild,ch); if(k) return k; else return BTsearch(st->rchild,ch); } }}Tree BTsearch1(Tree st,char ch) //返回值为BTree型的search{ if(st == NULL) return NULL; else { if(st->item == ch) return st; else { if(BTsearch(st->lchild,ch) == NULL) return BTsearch(st->rchild,ch); } }}int shortestpath(Tree st){ int hl,hr; if(st->lchild == NULL && st->rchild == NULL) return 0; else { if(st->lchild != NULL) hl = shortestpath(st->lchild)+1; if(st->rchild != NULL) hr = shortestpath(st->rchild)+1; if(hl < hr) return hl; else return hr; }}void laytraverse(Tree st){ Queue q; q.Front = 0; q.rear = 0; if(st != NULL) printf("%c ",st->item); q.bt[q.Front] = st; q.rear = q.rear+1; while(q.Front < q.rear) { st = q.bt[q.Front]; q.Front = q.Front+1; //每次移动一位,然后取这位节点的左右子节点,队列中相邻节点属于同一层! if(st->lchild != NULL) { q.bt[q.rear] = st->lchild; q.rear = q.rear+1; printf("%c ",st->lchild->item); } if(st->rchild != NULL) { q.bt[q.rear] = st->rchild; q.rear = q.rear+1; printf("%c ",st->rchild->item); } }}int BTequal(Tree st1,Tree st2){ if(st1 == NULL ^ st2 == NULL) //^是异或符号,之前的判断语句是:if(st1->item != st2->item) return 0; //此判断语句在st1 和st2 为NULL时“调试遇挫” else if(st1 == NULL && st2 == NULL) return 1; else if(st1->item == st2->item) { if(1 == BTequal(st1->lchild,st2->lchild)) return BTequal(st1->rchild,st2->rchild); else return 0; }}void exchange(Tree st){ if(st == NULL) return; else { BTree *tmp; tmp = st->lchild; st->lchild = st->rchild; st->rchild = tmp; exchange(st->lchild); exchange(st->rchild); }}int check(Tree p,Tree q){ if(p != NULL && q == NULL) return 0; else if(p == NULL && q != NULL) return 0; else if(p != NULL && q != NULL) { if(p->item != q->item) return 0; else { if(check(p->lchild,q->rchild) == 1) return check(p->rchild,q->lchild); } } else return 1;}int symmetry(Tree st){ if(st == NULL) return 1; else return check(st->lchild,st->rchild);}
0 0
- 二叉树的相关操作:创建、查找、求高度和深度、各种遍历(前、中、后、层序)等等
- 二叉树 前 后 中序遍历, 按层遍历, 求高度, 交换左右儿子等
- 二叉树的前、中、后序遍历(递归和非递归)、层序遍历、深度、叶子节点个数
- 二叉树的各种操作:前序、中序、后序、层序遍历,二叉树搜索、插入和删除等操作
- 二叉树的各种操作 先序 中序 后续 层次 遍历 求树高度 节点深度 知先序中序求后续 二叉排序树
- 二叉树的中序、前序、后序以及层序的非递归遍历并求树的深度和结点总数
- 二叉树的,前/中/后序的遍历( 递归,非递归),层序遍历,以及各种应用功能
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的创建、前/中/后序遍历、按层遍历C语言实现
- Java二叉树(一)--定义及前序、中序、后序、层次遍历及求高度的实现
- 将字符串转换成整数
- NLTK——NLP编程的基础工具
- 对象调用数组运用 学习很吃力
- ASP.Net Cache(缓存)
- Mybatis中的resultType和resultMap
- 二叉树的相关操作:创建、查找、求高度和深度、各种遍历(前、中、后、层序)等等
- 超级台阶
- order by 与group by的区别!
- 《C语言及程序设计》程序阅读——文件操作
- 关于学习资源的整合网站(想自学的可以看一下)
- Android PopupWindow的使用和分析
- 2. Zend_Controller 快速入门
- Java面向对象之重载和重写
- javaSE学习笔记之线程