Linux C 算法与数据结构 --二叉树
来源:互联网 发布:期货仓位 知乎 编辑:程序博客网 时间:2024/05/16 04:28
头文件BiTree.h
typedef int Item;typedef struct node{ struct node * lchild; struct node * rchild; Item data;}BiTNode,*BiTree;/*构造一棵新的二叉树*/BiTree InitBiTree(BiTNode *root);/*生成节点*/BiTNode *MakeNode(Item item,BiTNode *lchild,BiTNode *rchild);/*释放节点*/void FreeNode(BiTNode *pnode);/*清空一棵二叉树*/void ClearBiTree(BiTree tree);/*销毁一棵二叉树*/void DestroyBiTree(BiTree tree);/*判定是否为空*/IsEmpty(BiTree tree);/*返回树的深度*/GetDepth(BiTree tree);/*返回根*/BiTree GetRoot(BiTree tree);/*返回节点值*/Item GetItem(BiTNode *pnode);/*设置节点值*/void SetItem(BiTNode *pnode,Item item);/*设置左子树*/BiTree SetLChild(BiTree parent,BiTree lchild);/*设置右子树*/BiTree SetRChild(BiTree parent,BiTree rchild);/*返回左子树*/BiTree GetLChild(BiTree tree);/*返回右子树*/BiTree GetRChild(BiTree tree);/*插入新子树*/BiTree InsertChild(BiTree parent,int lr,BiTree child);/*删除子树*/void DeleteChild(BiTree parent,int lr);/*先序遍历二叉树*/PreOrderTraverse(BiTree tree,void(*visit)());/*中序遍历二叉树*/InOrderTraverse(BiTree tree,void(*visit)());/*后序遍历二叉树*/PostOrderTraverse(BiTree tree,void(*visit)());
实现文件BiTree.c
#include"BiTree.h"#include<malloc.h>#include<stdlib.h>/*构造一棵新的二叉树*/BiTree InitBiTree(BiTNode *root){ BiTree tree = root; return tree;}/*生成节点*/BiTNode *MakeNode(Item item,BiTNode *lchild,BiTNode *rchild){ BiTNode * pnode = (BiTNode *)malloc(sizeof(BiTNode)); if(pnode) { pnode->data = item; pnode->lchild = lchild; pnode->rchild = rchild; } return pnode; }/*释放节点*/void FreeNode(BiTNode *pnode){ if(pnode!=NULL) free(pnode);}/*清空一棵二叉树*/void ClearBiTree(BiTree tree){ BiTNode * pnode = tree; if(pnode->lchild!=NULL) ClearBiTree(pnode->lchild); if(pnode->rchild!=NULL) ClearBiTree(pnode->rchild); FreeNode(pnode);}/*销毁一棵二叉树*/void DestroyBiTree(BiTree tree){ if(tree) ClearBiTree(tree); }/*判定是否为空*/IsEmpty(BiTree tree){ if(tree==NULL) return 0; else return 1;}/*返回树的深度*/int GetDepth(BiTree tree){ int cd,ld,rd; cd = ld = rd = 0; if(tree) { ld = GetDepth(tree->lchild); rd = GetDepth(tree->rchild); cd = (ld > rd ? ld : rd); return cd+1; } else return 0;}/*返回根*/BiTree GetRoot(BiTree tree){ return tree;}/*返回节点值*/Item GetItem(BiTNode *pnode){ return pnode->data;}/*设置节点值*/void SetItem(BiTNode *pnode,Item item){ pnode->data = item;}/*设置左子树*/BiTree SetLChild(BiTree parent,BiTree lchild){ parent->lchild = lchild; return lchild;}/*设置右子树*/BiTree SetRChild(BiTree parent,BiTree rchild){ parent->rchild = rchild; return rchild;}/*返回左子树*/BiTree GetLChild(BiTree tree){ if(tree) return tree->lchild; return NULL;}/*返回右子树*/BiTree GetRChild(BiTree tree){ if(tree) return tree->rchild; return NULL;}/*插入新子树*/BiTree InsertChild(BiTree parent,int lr,BiTree child){ if(parent) { if( lr == 0 && parent->lchild == NULL) { parent->lchild = child; return child; } if( lr == 1 && parent->rchild == NULL) { parent->rchild = child; return child; } } return NULL; }/*删除子树*/void DeleteChild(BiTree parent,int lr){ if(parent) { if( lr == 0 && parent->lchild != NULL) { parent->lchild = NULL; FreeNode(parent->lchild); } if( lr == 1 && parent->rchild != NULL) { parent->rchild = NULL; FreeNode(parent->rchild); } }}/*先序遍历二叉树*/PreOrderTraverse(BiTree tree,void(*visit)()){ BiTNode * pnode = tree; if(pnode) { visit(pnode->data); PreOrderTraverse(pnode->lchild,visit); PreOrderTraverse(pnode->rchild,visit); }}/*中序遍历二叉树*/InOrderTraverse(BiTree tree,void(*visit)()){ BiTNode * pnode = tree; if(pnode) { InOrderTraverse(pnode->lchild,visit); visit(pnode->data); InOrderTraverse(pnode->rchild,visit); }}/*后序遍历二叉树*/PostOrderTraverse(BiTree tree,void(*visit)()){ BiTNode * pnode = tree; if(pnode) { PostOrderTraverse(pnode->lchild,visit); PostOrderTraverse(pnode->rchild,visit); visit(pnode->data); }}
测试程序如下
#include"BiTree.h"#include<stdio.h>void print(Item item){ printf("%d ",item);}main(){ BiTNode * n1 = MakeNode(10,NULL,NULL); BiTNode * n2 = MakeNode(20,NULL,NULL); BiTNode * n3 = MakeNode(30,n1,n2); BiTNode * n4 = MakeNode(40,NULL,NULL); BiTNode * n5 = MakeNode(50,NULL,NULL); BiTNode * n6 = MakeNode(60,n4,n5); BiTNode * n7 = MakeNode(70,NULL,NULL); BiTree tree = InitBiTree(n7); SetLChild(tree,n3); SetRChild(tree,n6); printf("树的深度为:%d",GetDepth(tree)); printf("\n先序遍历如下:"); PreOrderTraverse(tree,print); printf("\n中序遍历如下:"); InOrderTraverse(tree,print); printf("\n后序遍历如下:"); PostOrderTraverse(tree,print); DeleteChild(tree,1); printf("\n后序遍历如下:"); PostOrderTraverse(tree,print); DestroyBiTree(tree); if(IsEmpty(tree)) printf("\n二叉树为空,销毁完毕\n");}
执行结果如下:
fs@ubuntu:~/qiang/tree$ ./Test树的深度为:3先序遍历如下:70 30 10 20 60 40 50 中序遍历如下:10 30 20 70 40 60 50 后序遍历如下:10 20 30 40 50 60 70 二叉树为空,销毁完毕
0 0
- Linux C 算法与数据结构 --二叉树
- Linux C 算法与数据结构 --二叉树
- 数据结构与算法(C#)--树和二叉树
- (C语言-数据结构与算法)还原二叉树
- 数据结构与算法(C语言版)__二叉树
- 数据结构与算法(C语言版)__二叉查找树
- 【数据结构与算法】二叉树
- 数据结构与算法-二叉树
- 算法与数据结构 - 二叉树
- 数据结构与算法:二叉树
- 数据结构与算法:二叉树
- 数据结构与算法-二叉树
- c#-二叉树数据结构及算法
- [数据结构与算法]二叉树与二叉树遍历
- 数据结构与算法(C#实现)---二叉树
- 数据结构与算法(C#实现)---二叉树
- 数据结构与算法系列---二叉树
- 数据结构与算法之二叉树遍历
- 计算文字的高度
- cocos2d(3)CCLayer的三个子类CCLayerColorCCLayerGridentCCLayerMultiplex
- COCOS2D-JS的屏幕适配方案
- hdu4508 湫湫系列故事——减肥记I (完全背包)
- 八皇后问题(递归+回溯)
- Linux C 算法与数据结构 --二叉树
- Java回炉之泛型
- 车牌识别资料收集
- Mac OS X Java环境变量配置
- c语言2 printf
- 【android_温故知新】第 5 组 UI 组件:ProgressBar 及其子类
- Ubuntu15 安装VMware Tools
- 2010 水仙花
- Java回炉之集合框架