数据结构:二叉树
来源:互联网 发布:php代码模板 编辑:程序博客网 时间:2024/06/03 16:29
头文件
#ifndef __BTREE_H__#define __BTREE_H__ #define LCHILD 0#define RCHILD 1#include"error.h"typedef char BTREEDATA;typedef struct _btreenode{BTREEDATA data;struct _btreenode *lchild;struct _btreenode *rchild;}BTREENODE;typedef struct _btree{struct _btreenode *root;int count;}BTREE;//创建二叉树BTREE * Creat_BTree();//插入一个二叉树//pos 用整数表示插入的路径//count 表示行走路径的次数//flag 表示被插入后子节点所在新节点的位置int Insert_BTree(BTREE* btree,BTREEDATA data,int pos,int count,int flag);//打印二叉树int Risplay(BTREE* btree);//删除二叉树一个节点int Del_BTree(BTREE* btree,int pos,int count);//求二叉树的高度int BTree_Height(BTREE* btree);//求二叉树的度int BTree_degree(BTREE* btree);//清空二叉树int BTree_clear(BTREE* btree);//删除二叉树int BTree_Destroy(BTREE** btree);//前序遍历二叉树void pre_order (BTREENODE* node);//中序遍历二叉树void mid_order (BTREENODE* node);//后序遍历二叉树void last_order (BTREENODE* node);#endif
主函数
#include<stdio.h>#include"BTree.h"#include<stdlib.h>//创建二叉树BTREE* Creat_BTree(){BTREE* btree = (BTREE*)malloc(sizeof(BTREE)/sizeof(char));if (btree == NULL){errno = MALLOC_ERROR;printf("创建失败\n");return NULL;}else {printf("创建成功\n");}btree->root = NULL;btree->count = 0;return btree;}//插入一个二叉树int Insert_BTree(BTREE* btree,BTREEDATA data,int pos,int count,int flag){//创建新节点BTREENODE * node = (BTREENODE *)malloc(sizeof(BTREENODE)/sizeof(char));if (node == NULL){errno = MALLOC_ERROR;printf("创建失败\n");return FALSE;}node->data = data;node->lchild = NULL; node->rchild = NULL;BTREENODE * parent = NULL; //保存行走之后的父节点BTREENODE * current = btree->root; //表示要插入的节点int way;while(count > 0 && current != NULL) //找要插入的位置{way = pos & 1;pos = pos >> 1;parent = current;if (way == LCHILD)current = current->lchild;else current = current->rchild;count--;}//决定后面的插在新节点的哪里if (flag == LCHILD)node->lchild = current;else node->rchild = current;if(parent != NULL){if (way == LCHILD)parent->lchild = node;else parent->rchild = node;}else {btree->root = node;}btree->count++;return TRUE;}//递归打印void r_display(BTREENODE* node,int flag){int i;if(node == NULL){for(i=0; i<flag; i++){printf("-");}printf("\n");return;}for(i=0; i<flag; i++){printf("-");}printf("%c\n",node->data);if(node->lchild == NULL && node->rchild == NULL)return ;r_display(node->lchild,flag+4);r_display(node->rchild,flag+4);}//打印二叉树int Risplay(BTREE* btree){if(btree == NULL){errno = ERROR;return FALSE;}r_display(btree->root,0);}//递归删除void r_del_BTree(BTREE* btree,BTREENODE* node){if (btree == NULL || node == NULL)return ;r_del_BTree(btree,node->lchild); //删除左子节点r_del_BTree(btree,node->rchild); //删除右子节点free(node);btree->count--;}//删除二叉树一个节点int Del_BTree(BTREE* btree,int pos,int count){if(btree == NULL){errno = ERROR;return FALSE;}BTREENODE * parent = NULL; //保存行走之后的父节点BTREENODE * current = btree->root; //表示要插入的节点int way;while(count > 0 && current != NULL) //找要插入的位置{way = pos & 1;pos = pos >> 1;parent = current;if (way == LCHILD)current = current->lchild;else current = current->rchild;count--;}if(parent != NULL) //删除{if (way == LCHILD)parent->lchild = NULL;else parent->rchild = NULL;}r_del_BTree(btree,current); //调用递归函数,释放删除的空间}//递归求高度int r_height(BTREENODE* node){if (node == NULL)return 0;int lh = r_height(node->lchild)+1;int rh = r_height(node->rchild)+1;return (lh>rh ? lh : rh);}//求二叉树的高度int BTree_Height(BTREE* btree){if (btree == NULL){errno = ERROR;return -1;}BTREENODE* current = btree->root;int height = r_height(current);return height;}int r_degree(BTREENODE* node){if (node == NULL)return 0;int degree = 0;if (node->lchild != NULL)degree++;if (node->rchild != NULL)degree++;//只要判断degree是1的情况if(degree == 1){int ld = r_degree(node->lchild);if (ld == 2)return 2;int rd = r_degree(node->rchild);if (rd == 2)return 2;}return degree;}//求二叉树的度int BTree_degree(BTREE* btree){if (btree == NULL){errno = ERROR;return -1;}BTREENODE* current = btree->root;int degree = r_degree(current);return degree;}//清空二叉树int BTree_clear(BTREE* btree){if (btree == NULL){errno = ERROR;return FALSE;}if(btree->root == NULL)return TRUE;Del_BTree(btree,0,0); //删除根节点btree->root = NULL;return TRUE;}//删除二叉树int BTree_Destroy(BTREE** btree){if (btree == NULL || *btree == NULL){errno = ERROR;return FALSE;}BTree_clear(*btree);free(*btree);*btree = NULL;return TRUE;}//前序遍历二叉树void pre_order (BTREENODE* node){if (node == NULL)return ;printf("%4c",node->data);pre_order (node->lchild);pre_order (node->rchild);}//中序遍历二叉树void mid_order (BTREENODE* node){if (node == NULL)return ;pre_order (node->lchild);printf("%4c",node->data);pre_order (node->rchild);}//后序遍历二叉树void last_order (BTREENODE* node){if (node == NULL)return ;pre_order (node->lchild);pre_order (node->rchild);printf("%4c",node->data);}
阅读全文
1 0
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 数据结构-二叉树算法
- java数据结构:二叉树
- 数据结构---二叉树
- 数据结构(C++)--二叉树
- JAVA 数据结构 二叉树
- 数据结构-二叉树 问题
- 转贴:数据结构:二叉树
- 二叉树(数据结构 c++)
- 数据结构-二叉树操作
- java数据结构----二叉树
- 数据结构二叉树
- 数据结构中的二叉树
- 数据结构--二叉树
- 数据结构二叉搜索树
- 自定义锁屏的实现
- bzoj 3894(最小割)
- Chrome: 完全移除对WoSign和StartCom证书的信任
- 代码管理工具git的使用
- python实现二叉树,以及二叉树的遍历
- 数据结构:二叉树
- POJ 3261 浅谈后缀数组HEIGHT数组的实际应用
- iOS-截取字符串中两个指定字符串中间的字符串
- 三分钟学会用SpringMVC搭建最小系统(超详细)
- Spring整合MQTT
- Android之FFmpeg(2)--FFmpeg结构总览及函数基本使用
- 广搜加优先队列 题目:Rescue
- 算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS
- Delphi 模式窗体返回值ModalResult的使用方法及注意事项