创建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和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...
随机推荐
- Python 操作 MySQL 数据库Ⅳ
执行事务 事务机制可以确保数据一致性. 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性. 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中包 ...
- Java架构师面试题——JVM性能调优
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
Fiddler]手机安装https证书报错:无法安装该证书 因为无法读取该证书文件 之前在手机上使用 “ip:端口号” 的方法就能直接在手机上自动下载安装fiddler证书,但是现在有些手机并不能 ...
- dockerfile:python-cuda-nvidia-cudnn
centos7 FROM centos:7 MAINTAINER yon@DataExa.com RUN yum -y install make wget \ && wget -O / ...
- sql2014 日志太大 删除日志
首先,我们要确认日志的文件名,因为硬盘上的文件名不一定是数据字典里面的文件名,所以要确认下 USE test9572 GO SELECT file_id,name FROM sys.database_ ...
- 简单加密 DEncrypt
/// <summary> /// Encrypt 的摘要说明. /// </summary> public class DEncrypt { /// <summary& ...
- CentOS7 服务器上如何安装python3
1.官网下载python3的源码包 网址:https://www.python.org/ 进去之后点击导航栏的Downloads,也可以鼠标放到Downloads上弹出菜单选择Source code, ...
- oracle ROW_NUMBER() OVER(PARTITION BY '分组' ORDER BY '排序' DESC) 用法
转载:https://blog.csdn.net/dbagaoshou/article/details/51330829 SELECT * FROM ( SELECT ROW_NUMBER() OVE ...
- hive 分组排序函数 row_number() over(partition by " " order by " "desc
语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...
- apache的httpclient进行http的交互处理
使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclient源码 ...