C语言之二叉树(包括遍历的实现)

来源:互联网 发布:怎么购买备案域名 编辑:程序博客网 时间:2024/06/05 20:55
//头函数#ifndef __2TREE_H__#define __2TREE_H__#include "error.h"#define TRUE  1#define FALSE 0typedef 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;elsecurrent = current->rchild;count --;}if(flag == 0)node->lchild = current;elsenode->rchild = current;if(parent != NULL){if(way == 0)parent->lchild = node;elseparent->rchild = node;}elsetree->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;elsecurrent = current->rchild;count --;}if(parent != NULL){if(way == 0)parent->lchild = NULL;elseparent->rchild = NULL;}elsetree->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;}