创建B树,动态添加节点,并使用三种遍历算法对树进行遍历
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树,动态添加节点,并使用三种遍历算法对树进行遍历的更多相关文章
- JQuery--Ajax 异步操作 动态添加节点 (新人试水,求支持)
异步操作动态添加节点,导致在代码中给添加的节点全局绑定事件或者获取元素无效,上代码: $(function () { var IP = '...'; // 页面中的默认编号起始值 和 公用IP前缀 s ...
- DataGridView动态添加新行的两种方法
简单介绍如何为DataGridView控件动态添加新行的两种方 法: 方法一: int index=this.dataGridView1.Rows.Add();this.dataGridView1.R ...
- CentOS添加环境变量的三种方式
CentOS添加环境变量的三种方式,以添加php环境变量为例,假定php的安装目录为 /usr/local/php5 一.仅对当前会话临时生效 [root@bogon ~]# export PATH= ...
- (一)JQuery动态加载js的三种方法
Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...
- 转:extjs 添加loading状态的三种解决办法:
extjs 添加loading状态的三种解决办法: 方法一: //materialGrid 指需要显示loading状态的控件id var o=Ext.getCmp('materialGrid'); ...
- Hadoop 2.6.0动态添加节点
文章出自:http://my.oschina.net/leoleong/blog/477508 本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6 ...
- BZOJ 3065 替罪羊树+动态开节点线段树
思路: RT 可以看VFK的题解 我写了半天拍了半天... 不过是$nlog^2n$的 要写垃圾回收的 线段树 如果某个节点的sum是0 也可以free掉 //By SiriusRen #inclu ...
- 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。
使用 from lazy_object_proxy.utils import cached_property,使用这个装饰器. 由于官方的行数比较少,所以可以直接复制出来用自己的. class cac ...
- 使用Kubeadm创建k8s集群之节点部署(三十一)
前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...
随机推荐
- Spring框架的七大模块
转载于:https://www.cnblogs.com/Z-wen/p/11681211.html Spring框架的七大模块 1. Spring Core:Core封装包是框架的最基础部分,提供 ...
- django + jquery 实现二级联动
二级联动用ajax还是很好实现的,下面简单给个例子 jquery代码 $("#id_sel").change(function(){ $.get("/browser/ge ...
- 「POI 2010」Bridges
题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...
- 2019年9月17 发布 Java 13
Java 13 明天发布,最新最全新特性解读 2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网 ...
- spark 笔记 14: spark中的delay scheduling实现
延迟调度算法的实现是在TaskSetManager类中的,它通过将task存放在四个不同级别的hash表里,当有可用的资源时,resourceOffer函数的参数之一(maxLocality)就是这些 ...
- SAP MaxDB日常运维—启动、关闭、磁盘扩容
SAP MaxDB日常维护1.检查MaxDB状态,并启动su - pe0csccd /sapdb/SDB/db/bin./dbmcli -d SDB -u superdba,Mypassword db ...
- D2下午
前言 至于为什么D2要分上下午,唯一的原因就是lyd那个毒瘤用了一上午讲他昨天要讲的鬼畜东西,所以今天下午才开始讲数论了 对了,补一下lyd的数论人 <数论人>(大雾) 数论的光束是歌德巴 ...
- 有关于Git操作(持续更新)
Git分支: 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git check ...
- iOS 图表工具charts之CombinedChartView
关于charts的系列视图介绍传送门: iOS 图表工具charts介绍 iOS 图表工具charts之LineChartView iOS 图表工具charts之BarChartView iOS 图表 ...
- ControlTemplate in WPF —— ListBox
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...