二叉树链式存储的实现
2014-05-16 18:15
253 查看
//filename:bitree.h #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define NIL '#' //定义'#'为空节点 typedef struct queue_node qnode; typedef struct bitree_node bitree; struct bitree_node { char elem; bitree *lchild; bitree *rchild; }; /*队列节点*/ struct queue_node { bitree *btn; qnode *next; }; typedef struct link_queue { qnode *head; qnode *tail; }queue; /*****队列的基本操作******/ int init_link_queue(queue *Q); int is_queue_empty(queue Q); int enqueue(queue *Q, bitree *btn); int dequeue(queue *Q, char *elem); /*****二叉树的操作*****/ bitree *create_bitree(); int is_bitree_empty(bitree *btn); int get_bitree_depth(bitree *btn); bitree *get_parent(bitree *btn, char elem); int preorder_traverse(bitree *btn, int (*visit)(char)); int inorder_traverse(bitree *btn, int (*visit)(char)); int postorder_traverse(bitree *btn, int (*visit)(char)); int levelorder_traverse(bitree *btn, int (*visit)(char)); int destory_bitree(bitree *btn); int print_elem(char elem);
//filename:queue.c#include "bitree.h"/*功能:链队列初始化*/int init_link_queue(queue *Q){qnode *tmp_node = (qnode *)malloc(sizeof(qnode));if(!tmp_node){return ERROR;}tmp_node->btn = NULL;tmp_node->next = NULL;Q->head = tmp_node;Q->tail = tmp_node;return OK;}/*功能:队列是否为空返回:1 空;0 非空*/int is_queue_empty(queue Q){return ((Q.head == Q.tail) ? TRUE : FALSE);}/*功能:元素num入队*/int enqueue(queue *Q, bitree *btn){qnode *tmp_node = (qnode *)malloc(sizeof(qnode));if(!tmp_node){return ERROR;}tmp_node->next = NULL;tmp_node->btn = btn;Q->tail->next = tmp_node;Q->tail = tmp_node;return OK;}/*功能:出队,队头元素存入num参数: Q 队列;btn_addr 存放出队节点内的bitree *地址*/int dequeue(queue *Q, int *btn_addr){qnode *tmp_node = NULL;if(is_queue_empty(*Q)){return ERROR;}tmp_node = Q->head->next;Q->head->next = tmp_node->next;*btn_addr = tmp_node->btn;if(Q->head->next == NULL){Q->tail = Q->head;}free(tmp_node);return OK;}
//filename:bitree.c#include "bitree.h"/*功能:先序创建二叉树返回:创建的节点地址*/bitree *create_bitree(){char elem;bitree *btn = NULL;fflush(stdin); //清空输入缓冲流scanf("%c", &elem);if(elem == NIL){return btn;}else{btn = (bitree *)malloc(sizeof(bitree));btn->elem = elem;btn->lchild = create_bitree();btn->rchild = create_bitree();return btn;}}/*功能:判断该二叉树是否为空返回:1 空; 0 非空*/int is_bitree_empty(bitree *btn){if(!btn){return TRUE;}else{return FALSE;}}/*功能:求二叉树的深度*/int get_bitree_depth(bitree *btn){int i = 0; //记录左子树深度int j = 0; //记录右子树深度if(!btn){return 0;}if(btn->lchild){i = get_bitree_depth(btn->lchild);}else{i = 0;}if(btn->rchild){j = get_bitree_depth(btn->rchild);}else{j = 0;}return (i > j) ? (i + 1) : (j + 1);}/*功能:获取元素elem节点的父结点返回:如果elem为根,返回NULL;*/bitree *get_parent(bitree *btn, char elem){int btn_addr = 0;bitree *father_node = NULL;queue Q;if(!btn) //树为空{return NULL;}init_link_queue(&Q); //初始化队列enqueue(&Q, btn);while(!is_queue_empty(Q)) //队列不为空{dequeue(&Q, &btn_addr);father_node = btn_addr;if((father_node->lchild && father_node->lchild->elem == elem) ||(father_node->rchild && father_node->rchild->elem == elem)){return father_node;}else{if(father_node->lchild){enqueue(&Q, father_node->lchild);}if(father_node->rchild){enqueue(&Q, father_node->rchild);}}}return NULL;}/*功能:先序遍历二叉树*/int preorder_traverse(bitree *btn, int (*visit)(char)){if(!btn){return OK;}visit(btn->elem);preorder_traverse(btn->lchild, visit);preorder_traverse(btn->rchild, visit);return OK;}/*功能:中序遍历二叉树*/int inorder_traverse(bitree *btn, int (*visit)(char)){if(!btn){return OK;}inorder_traverse(btn->lchild, visit);visit(btn->elem);inorder_traverse(btn->rchild, visit);return OK;}/*功能:后序遍历二叉树*/int postorder_traverse(bitree *btn, int (*visit)(char)){if(!btn){return OK;}postorder_traverse(btn->lchild, visit);postorder_traverse(btn->rchild, visit);visit(btn->elem);return OK;}/*功能:按层序遍历二叉树,借助队列*/int levelorder_traverse(bitree *btn, int (*visit)(char)){int btn_addr = 0; //记录出队的队列节点的(bitree *)的地址bitree *bitree_node = NULL;queue Q;if(!btn) //树为空{return NULL;}init_link_queue(&Q); //初始化队列enqueue(&Q, btn);while(!is_queue_empty(Q)) //队列不为空{dequeue(&Q, &btn_addr);bitree_node = btn_addr;visit(bitree_node->elem);if(bitree_node->lchild){enqueue(&Q, bitree_node->lchild);}if(bitree_node->rchild){enqueue(&Q, bitree_node->rchild);}}return NULL;}/*功能: 销毁二叉树*/int destory_bitree(bitree *btn){if(btn){if(btn->lchild){destory_bitree(btn->lchild);}if(btn->rchild){destory_bitree(btn->rchild);}free(btn);btn = NULL;}return OK;}/*功能:打印传入的参数值*/int print_elem(char elem){printf("%c ", elem);return OK;}
//filename:test_bitree.c#include "bitree.h"/*测试数据: 先序创建树:abd###c##;先序遍历: abdc中序遍历: dbac后序遍历: dbca*/int main(int argc, char *argv[]){bitree *tmpnode = NULL;bitree *bitree = NULL;bitree = create_bitree();preorder_traverse(bitree, print_elem);printf("\n");inorder_traverse(bitree, print_elem);printf("\n");postorder_traverse(bitree, print_elem);printf("\n");levelorder_traverse(bitree, print_elem);printf("\n");printf("the depth of the bitree is %d.\n", get_bitree_depth(bitree));tmpnode = get_parent(bitree, 'd');printf("the 'd' father node is:%c\n", tmpnode->elem);destory_bitree(bitree);system("pause");return 0;}
相关文章推荐
- 二叉树的链式存储与实现(C++)
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- java实现二叉树的链式存储
- 数据结构之C/C++实现二叉树的链式存储
- 数据结构:二叉树的链式存储实现
- 二叉树的链式存储实现及遍历
- 二叉树的链式存储实现
- 二叉树链式存储的实现
- Java实现链式存储的二叉树
- 二叉树的链式存储实现
- 使用java实现链式存储的二叉树
- 二叉树的链式存储结构 C++代码实现
- 二叉树链式存储的C实现
- 二叉树(二叉链式存储)8种基本操作的实现
- 二叉树链式存储,实现先中后序输出,并求叶子结点数
- 二叉树-链式存储-Java实现(未完待续)
- 二叉树基本操作实现(二叉树的链式存储)
- 树和二叉树的链式存储实现
- 循环链表-链式存储-Java实现
- 数据结构_树_二叉树的建立、遍历、复制与移除_二叉链表存储_C++实现