C语言之二叉树(包括遍历的实现)
2017-07-31 19:41
351 查看
//头函数 #ifndef __2TREE_H__ #define __2TREE_H__ #include "error.h" #define TRUE 1 #define FALSE 0 typedef struct _btree { char data; struct _btree *rchild; struct _btree *lchild; }Btree; typedef struct _head { struct _btree *head; int count; }Head; //创建树 Head *creat_tree(); //插入结点 int Insert_btree(Head *tree, char data, int pos, int count, int flag); //打印二叉树 void Display (Head* tree); //结点的删除 int Delete (Head *tree, int pos, int count); //二叉树的高度 int BTree_Height (Head *); //二叉树的度 int BTree_Degree (Head *); //二叉树的清空 int BTree_Clear (Head *); //二叉树的销毁 int BTree_Destroy (Head **); //前序遍历 void pre_order (Btree *node); //中序遍历 void mid_order (Btree *node); //后序遍历 void last_order (Btree *node); #endif //__2TREE_H__
//主演代码 #include "2tree.h" #include <stdlib.h> Head *creat_tree() { Head *tree = (Head *)malloc(sizeof(Head)/sizeof(char)); if(tree == NULL) { return FALSE; } tree->head = NULL; tree->count = 0; return tree; } int Insert_btree(Head *tree, char data, int pos, int count, int flag) { if(tree == NULL || flag != 0 && flag != 1) { return FALSE; } Btree *node = (Btree *)malloc(sizeof(Btree)/sizeof(char)); if(node == NULL) { return FALSE; } node->data = data; node->rchild = NULL; node->lchild = NULL; Btree *parent = NULL; Btree *current = tree->head; int way; while(count) { way = pos & 1; pos = pos >> 1; parent = current; if(way == 0) current = current->lchild; else current = current->rchild; count --; } if(flag == 0) node->lchild = current; else node->rchild = current; if(parent != NULL) { if(way == 0) parent->lchild = node; else parent->rchild = node; } else tree->head = node; tree->count++; return TRUE ; } void r_display(Btree *node,int gap) { int i; if(node == NULL) { for(i = 0; i < gap; i++) { printf("-"); } printf("\n"); return; } for(i = 0; i < gap; i++) { printf("-"); } printf("%c\n",node->data); if(node->lchild != NULL || node->rchild !=NULL) { r_display(node->lchild, gap + 4); r_display(node->rchild, gap + 4); } } void Display (Head* tree) { if(tree == NULL) { return; } r_display(tree->head, 0); } void r_delete(Head *tree, Btree *node) { if(node == NULL || tree == NULL) { return; } r_delete(tree, node->lchild); r_delete(tree, node->rchild); free(node); tree->count--; } int Delete (Head *tree, int pos, int count) { if(tree == NULL) { return FALSE; } Btree *parent = NULL; Btree *current = tree->head; int way = 0; while(count) { way = pos & 1; pos = pos >> 1; parent = current; if(way == 0) current = current->lchild; else current = current->rchild; count --; } if(parent != NULL) { if(way == 0) parent->lchild = NULL; else parent->rchild = NULL; } else tree->head = NULL; r_delete(tree,current); return TRUE; } int r_Height(Btree *node) { if(node == NULL) { return 0; } int lh = r_Height(node->lchild); int rh = r_Height(node->rchild); return (lh > rh ? lh+1 : rh+1); } int BTree_Height (Head *tree) { if(tree == NULL) { return FALSE; } int subHeight = r_Height(tree->head); return subHeight; } int r_Degree(Btree *node) { if(node == NULL) { return 0; } int degree = 0; if(node->rchild != NULL) degree++; if(node->lchild != NULL) degree++; if(degree == 1) { int rd = r_Degree(node->rchild); if(rd == 2) return 2; int ld = r_Degree(node->lchild); if(ld == 2) return 2; } return degree; } int BTree_Degree(Head *tree) { if(tree == NULL) { return FALSE; } int degree = r_Degree(tree->head); return degree; } int BTree_Clear (Head *tree) { if(tree == NULL) { return FALSE; } Delete(tree,0,0); return TRUE; } int BTree_Destroy (Head **tree) { if(tree == NULL) { return FALSE; } BTree_Clear(*tree); free(*tree); return TRUE; } void pre_order (Btree *node) { if(node == NULL) { return ; } printf("%4c",node->data); pre_order(node->lchild); pre_order(node->rchild); } void mid_order (Btree *node) { if(node == NULL) { return ; } mid_order(node->lchild); printf("%4c",node->data); mid_order(node->rchild); } void last_order (Btree *node) { if(node == NULL) { return ; } last_order(node->lchild); last_order(node->rchild); printf("%4c",node->data); }
//主函数 #include <stdio.h> #include "2tree.h" int main() { Head *tree = creat_tree(); Insert_btree(tree, 'A', 0, 0, 0); Insert_btree(tree, 'B', 0, 1, 0); Insert_btree(tree, 'C', 2, 2, 0); Insert_btree(tree, 'D', 2, 3, 0); Insert_btree(tree, 'E', 6, 3, 0); Insert_btree(tree, 'F', 1, 1, 0); Insert_btree(tree, 'G', 3, 2, 0); Display(tree); printf("前序遍历:"); pre_order (tree->head); printf("\n"); printf("中序遍历:"); mid_order (tree->head); printf("\n"); printf("后序遍历:"); last_order(tree->head); printf("\n"); printf("高度:%d\n",BTree_Height(tree)); printf("度 : %d\n",BTree_Degree(tree)); printf("删除结点后:\n"); Delete(tree, 2, 2); Display(tree); if(BTree_Destroy(&tree)) printf("销毁成功\n"); return 0; }
相关文章推荐
- 结点遍历C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- C语言实现二叉树的递归遍历和非递归遍历
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- C语言实现二叉树的递归遍历与非递归遍历
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- C语言实现二叉树的各种遍历及求解深度
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)
- 数据结构 二叉树的先序 中序 后序遍历(linux 下c语言实现)
- 实现平衡二叉排序树的各种算法(包括二叉树的递归遍历、非递归遍历)
- C语言实现中序线索化二叉树并遍历
- 层序遍历二叉树(不借助vector或deque,用C语言实现)
- C语言递归实现二叉树的先序、中序、后序遍历
- C语言实现二叉树的遍历
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 遍历二叉树的递归算法与非递归算法以及C语言实现
- C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)
- 二叉树的创建与遍历(C语言实现)