规定:根节点的值大于左节点但小于右节点的值,所以二叉树的值插入是唯一的,最后形成的树只跟根节点有关

定义节点:

struct tree_node {
      TypeElem  elem;

struct tree_node *fa;
      struct tree_node *left;
      struct tree_node *right;
};

 #include <stdio.h>
#include <stdlib.h> typedef int TypeElem; struct tree_node {
TypeElem elem;
struct tree_node *fa;
struct tree_node *left;
struct tree_node *right;
}; struct tree_node *root_ptr; //指向根节点的指针 #define IS_ROOT_NODE(ptree_fa, ptree, x) do{ if(ptree_fa) { \
if (ptree == ptree_fa->left) \
ptree_fa->left = x; \
else if (ptree == ptree_fa->right) \
ptree_fa->right = x; \
}else \
root_ptr = x; }while () //如果删除的是根节点root_ptr就变了 /* 在父节点下插入子节点(有可能是孙子节点了) */
struct tree_node *Insert(TypeElem elem, struct tree_node *T_fa, struct tree_node *T)
{
if (T == NULL) {
T = (struct tree_node *)malloc(sizeof(struct tree_node));
if (!T) {
printf("malloc error\n");
return NULL;
}
T->fa = T_fa;
T->elem = elem;
T->left = T->right = NULL;
}
else if (elem < T->elem)
T->left = Insert(elem, T, T->left);
else if (elem > T->elem)
T->right = Insert(elem, T, T->right); return T;
} struct tree_node *find_val(struct tree_node *rootp, TypeElem elem)
{
if (!rootp) {
printf("don't find\n");
return NULL;
}
//遍历:前序、中序、后序
if (rootp->elem == elem)
return rootp;
else if (rootp->elem > elem) {
return find_val(rootp->left, elem); //递归
}
else if (rootp->elem < elem) {
return find_val(rootp->right, elem); //递归
}
return NULL;
} struct tree_node *find_min_val(struct tree_node *rootp)
{
while (rootp->left) {
rootp = rootp->left;
}
return rootp;
} struct tree_node *find_max_val(struct tree_node *rootp)
{
while (rootp->right) {
rootp = rootp->right;
}
return rootp;
} int delete_tree(TypeElem elem, int isfree)
{
struct tree_node *ptree = find_val(root_ptr, elem);
struct tree_node *ptree_fa = ptree->fa;
struct tree_node *min_tree; if (!ptree)
return -;
if (!(ptree->left) && !(ptree->right)) {
IS_ROOT_NODE(ptree_fa, ptree, NULL);
}
else if (!(ptree->left) && ptree->right) {
IS_ROOT_NODE(ptree_fa, ptree, ptree->right);
ptree->right->fa = ptree_fa;
}
else if (ptree->left && !(ptree->right)) {
IS_ROOT_NODE(ptree_fa, ptree, ptree->left);
ptree->left->fa = ptree_fa;
}
else if (ptree->left && ptree->right) {
min_tree = find_min_val(ptree->right);
delete_tree(min_tree->elem, ); //递归
IS_ROOT_NODE(ptree_fa, ptree, min_tree);
min_tree->left = ptree->left;
min_tree->right = ptree->right;
min_tree->fa = ptree->fa;
}
if (isfree)
free(ptree);
return ;
} int main()
{
int i;
root_ptr = Insert(, NULL, root_ptr); //得到指向根节点的指针
TypeElem a[] = { ,,,,,,,, }; //依次插入9个节点
for (i = ; i < ; i++)
Insert(a[i], root_ptr->fa, root_ptr);
if (!delete_tree(, ))
printf("delete_tree ok\n");
if (root_ptr) {
if (find_val(root_ptr, ))
printf("find node\n");
}

return ;
}
 

形成的树结构:

如果删除根节点6,依然能找到节点9

C语言之二叉树的更多相关文章

  1. C语言实现二叉树-02版

    ---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那 ...

  2. C语言实现二叉树-利用二叉树统计单词数目

    昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...

  3. C语言实现二叉树

    二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会 ...

  4. C语言实现二叉树的基本操作

    二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...

  5. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  6. C语言数据库-二叉树

    一.定义 二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点.然而,没 ...

  7. go语言浅析二叉树

    Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历. 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历.中序 ...

  8. c语言_二叉树的建立以及3种递归

    二叉树c语言的实现 二叉树的建立 二叉树的数据结构 typedef struct node{    int data;    struct node* left;    struct node* ri ...

  9. C语言实现二叉树-04版

    二叉树,通常应当是研究其他一些复杂的数据结构的基础.因此,通常我们应该精通它,而不是了解:当然,可能并不是每个人都认同这种观点,甚至有些人认为理解数据结构就行了!根本没有必要去研究如何实现,因为大多数 ...

  10. C语言实现二叉树-03版

    我们亲爱的项目经理真是有创意,他说你给我写得二叉树挺好的: 功能还算可以:插入节点,能够删除节点: 可是有时候我们只是需要查找树的某个节点是否存在: 所以我希望你能够给我一个find功能: 还有就是, ...

随机推荐

  1. LeetCode-Container With Most Water-zz

    先上代码. #include <iostream> #include <vector> #include <algorithm> using namespace s ...

  2. 基于按annotation的hibernate主键生成策略

    基于按annotation的hibernate主键生成策略 博客分类: Hibernate HibernateJavaJPAOracleMySQL  这里讨论代理主键,业务主键(比如说复合键等)这里不 ...

  3. 教你如何封装异步网络连接NSURLConnection实现带有百分比的下载

    教你如何封装异步网络连接NSURLConnection实现带有百分比的下载 注:本教程需要你对block有着较为深刻的理解,且对如何封装对象有着一些经验. 也许你已经用惯了AFNetworking2. ...

  4. [使用教程]cocostudio之UI编辑器动画模式

    有坑! 1. 使用 (1)点击动画模式按钮,进入动画模式 (2)[关键1]左下角动作列表,右键添加动画 (3)[关键2]渲染区选择要动画的控件,右键编辑动画 * 可以看到最下面多了关键帧 (4)在右边 ...

  5. editplus 格式化 js、html、xml、css

    没有文件扩展”js”的脚本引擎的问题的解决办法 解决办法如下: 打开注册表编辑器,定位"HKEY_CLASSES_ROOT" > ".js" 这一项,双击 ...

  6. js中公有方法、特权方法、静态方法

    1.公有属性和公有方法 1 2 3 4 5 6 7 8 9 function User(name,age){   this.name = name;//公有属性   this.age = age; } ...

  7. GPU CUDA之——深入理解threadIdx

    http://blog.csdn.net/canhui_wang/article/details/51730264 摘要 本文主要讲述CUDA的threadIdx. 1. Grid,Block和Thr ...

  8. JQuery获取和设置Select选项的常用方法总结

    1.获取select 选中的 text:  $("#cusChildTypeId").find("option:selected").text();  $(&q ...

  9. php函数:call_user_func

    前段时间浏览文档发现一个有意思的PHP函数:call_user_func [文档地址] 函数作用:该函数主要用于通过函数名去调用该函数 例如: function test(){ echo " ...

  10. 7.spring:SpringAOP(配置文件)

    SpringAOP(xml文件配置) 配置文件的方式,主要是在xml文件中进行配置,不使用注解! 目录: AtithmeticCalculator.java public interface Atit ...