ks17:algorithm apple$ cat btree_test.c
///***************************************************************
/// @Filename: btree_test.c
/// @Brief: 尝试构建b树,并使用三种遍历算法对树进行遍历
///
///
/// @notice: 在函数里面申请空间给指针,是不能返回的,必须包装一层,赋值给指针的指针方式,否则函数返回后赋值结果是NULL
/// @Author: kuang17
/// @Last modified: 2019-06-17 18:51
///*************************************************************** #include "stdio.h"
#include "stdlib.h"
#include "string.h" ///定义结构
typedef struct treeNode
{
int data;
struct treeNode* parent;
struct treeNode* lch;
struct treeNode* rch;
}TreeNode; typedef struct BtreeData
{
TreeNode* rootNode;
}Btree; ///定义参数
struct BtreeData* m_btree; ///定义函数
TreeNode* mallocNode();
int initTree(Btree* btree, int rootData);
int perorderTraversalTree(TreeNode* pnode);
int inorderTraversalTree(TreeNode* pnode);
int postorderTraversalTree(TreeNode* pnode);
int addNode(TreeNode* parentNode, int newData); ///主函数
int main(int argc, char** argv)
{
int originData[100] = {0, 0, 0};
int count = 0; //init tree
m_btree = (struct BtreeData*)malloc(sizeof(struct BtreeData));
initTree(m_btree, atoi(argv[1]));
if(m_btree->rootNode != NULL)
printf("root data is: %d\n", m_btree->rootNode->data); //create tree
char input[12] = "{\0}";
int is_end = 1;
while (is_end)
{
gets(input);
printf("input is %s\n", input);
if (strcmp(input, "end") == 0){
printf("end input.\n");
is_end = 0;
} else{
//add to tree
addNode(m_btree->rootNode, atoi(input));
originData[count++] = atoi(input);
}
}
//perorder traversal
printf("perorder traversal :\n");
perorderTraversalTree(m_btree->rootNode); //inorder traversal
printf("inorder traversal :\n");
inorderTraversalTree(m_btree->rootNode); //postorder traversal
printf("postorder traversal: \n");
postorderTraversalTree(m_btree->rootNode); printf("\norigin is :\n");
for(int i = 0; i < count; i++)
{
printf("%d\n", originData[i]);
}
printf("end\n");
} // *********************************************************************
/// @Brief mallocNode 申请空间
///
/// @Returns
// *********************************************************************
TreeNode* mallocNode()
{
TreeNode* newNode;
newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = 0;
newNode->parent = NULL;
newNode->lch = NULL;
newNode->rch = NULL;
return newNode;
} // *********************************************************************
/// @Brief initTree 初始化树
///
/// @Param btree
/// @Param rootData
///
/// @Returns
// *********************************************************************
int initTree(Btree* btree, int rootData)
{
TreeNode* rootNode;
rootNode = mallocNode();
rootNode->data = rootData;
btree->rootNode = rootNode;
return 0;
} // *********************************************************************
/// @Brief addNode 添加节点
///
/// @Param parentNode
/// @Param newData
///
/// @Returns
// *********************************************************************
int addNode(TreeNode* parentNode, int newData)
{
TreeNode* newNode;
newNode = mallocNode();
newNode->data = newData; if(newData <= parentNode->data)
{
printf("parent data is: %d, add lch\n", parentNode->data);
if(parentNode->lch == NULL)
{
//这里没法直接给parentNode赋值,只能给他的节点赋值
parentNode->lch = newNode;
}else
{
addNode(parentNode->lch, newData);
}
} if(newData > parentNode->data)
{
printf("parent data is: %d, add rch\n", parentNode->data);
if(parentNode->rch == NULL){
parentNode->rch = newNode;
} else {
addNode(parentNode->rch, newData);
}
} return 0;
} // *********************************************************************
/// @Brief perorderTraversalTree 先序遍历
///
/// @Param pnode
///
/// @Returns
// *********************************************************************
int perorderTraversalTree(TreeNode* pnode)
{
if(pnode == NULL)
return 0; perorderTraversalTree(pnode->lch);
printf("%d\n", pnode->data);
perorderTraversalTree(pnode->rch);
return 1;
} // *********************************************************************
/// @Brief inorderTraversalTree 中序遍历
///
/// @Param pnode
///
/// @Returns
// *********************************************************************
int inorderTraversalTree(TreeNode* pnode)
{
if(pnode == NULL)
return 0; printf("%d\n", pnode->data);
inorderTraversalTree(pnode->lch);
inorderTraversalTree(pnode->rch);
return 1;
} // *********************************************************************
/// @Brief postorderTraversalTree 后序遍历
///
/// @Param pnode
///
/// @Returns
// *********************************************************************
int postorderTraversalTree(TreeNode* pnode)
{
if(pnode == NULL)
return 0; postorderTraversalTree(pnode->lch);
postorderTraversalTree(pnode->rch);
printf("%d\n", pnode->data);
return 1;
}

创建B树,动态添加节点,并使用三种遍历算法对树进行遍历的更多相关文章

  1. JQuery--Ajax 异步操作 动态添加节点 (新人试水,求支持)

    异步操作动态添加节点,导致在代码中给添加的节点全局绑定事件或者获取元素无效,上代码: $(function () { var IP = '...'; // 页面中的默认编号起始值 和 公用IP前缀 s ...

  2. DataGridView动态添加新行的两种方法

    简单介绍如何为DataGridView控件动态添加新行的两种方 法: 方法一: int index=this.dataGridView1.Rows.Add();this.dataGridView1.R ...

  3. CentOS添加环境变量的三种方式

    CentOS添加环境变量的三种方式,以添加php环境变量为例,假定php的安装目录为 /usr/local/php5 一.仅对当前会话临时生效 [root@bogon ~]# export PATH= ...

  4. (一)JQuery动态加载js的三种方法

    Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...

  5. 转:extjs 添加loading状态的三种解决办法:

    extjs 添加loading状态的三种解决办法: 方法一: //materialGrid 指需要显示loading状态的控件id var o=Ext.getCmp('materialGrid'); ...

  6. Hadoop 2.6.0动态添加节点

    文章出自:http://my.oschina.net/leoleong/blog/477508 本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6 ...

  7. BZOJ 3065 替罪羊树+动态开节点线段树

    思路: RT 可以看VFK的题解 我写了半天拍了半天... 不过是$nlog^2n$的 要写垃圾回收的 线段树 如果某个节点的sum是0  也可以free掉 //By SiriusRen #inclu ...

  8. 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。

    使用 from lazy_object_proxy.utils import cached_property,使用这个装饰器. 由于官方的行数比较少,所以可以直接复制出来用自己的. class cac ...

  9. 使用Kubeadm创建k8s集群之节点部署(三十一)

    前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...

随机推荐

  1. vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002

    自定义: WebApiConfig  里面最后增加 config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttp ...

  2. 2019春Python程序设计练习5(0416--0422)

    6-1 6-1.使用函数求特殊a串数列和 (30 分)   给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和 函数 ...

  3. 什么是DOM(文档对象模型)?

    ㈠什么是DOM? 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口. DOM 定义了访问 HTML 和 XML 文档的标准: ...

  4. [Flask]celery异步任务队列的使用

    Celery异步任务队列 目录结构树: 配置文件config.py: # 设置中间人地址 broker_url = 'redis://127.0.0.1:6379/1' 主main.py: impor ...

  5. Ubuntu镜像的MD5校验

    造冰箱的大熊猫@cnblogs 2018/9/7 1.在Ubuntu终端中,按照以下格式输入命令计算镜像文件ubuntu-xxx.iso的MD5校验和. md5sum ubuntu-xxx.iso 2 ...

  6. POJ 3683 神父赶婚宴 2-SAT+输出模板

    题意:一个小镇里面只有一个牧师,现在有些新人要结婚,需要牧师分别去主持一个仪式,给出每对新人婚礼的开始时间 s 和结束时间 t ,还有他们俩的这个仪式需要的时间(每对新人需要的时间长短可能不同) d ...

  7. MyOD C语言代码实现

    Myod C语言实现 一.题目要求 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Ma ...

  8. C++类的默认成员函数

    成员函数隐含this指针参数: 每成员函数一个隐式的指针形参(构造函数除外): 对象在调用成员函数时,编译器会将对象的地址传递给this指针: 1.构造函数(需用一个公有成员函数对私有的成员变量进行初 ...

  9. Dark 数据类型

     dark基础数据类型  1数值型 num int a =1; double b=1.0; 2 字符型 string a ='hello'; 插值表达式${expression} int a = 1; ...

  10. 《FS Book》: 如何让圣诞节邮件营销与众不同

    临近年末,双旦将至,这无疑是一年中最适合进行营销的时候,各大企业都开始进行促销活动,但与此同时,不要忘了问候你的客户,给他们真切的关怀.国内领先的邮件营销服务商Focussend在其最新一期<F ...