一、搜索二叉树的插入,查找,删除

简单说说搜索二叉树概念:

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

例如:int a [] = {5,3,4,1,7,8,2,6,0,9};



二叉树结构

typedef struct BSTreeNode
{
struct BSTreeNode *_left;
struct BSTreeNode *_right;
DataType _data;
}BSTreeNode;

二叉树节点创建

BSTreeNode *BuyTreeNode(DataType x) //创建节点
{
BSTreeNode *node = (BSTreeNode*)malloc(sizeof(BSTreeNode));
assert(node); node->_data = x;
node->_left = NULL;
node->_right = NULL; return node;
}

二叉搜索树操作:

1、搜索二叉树的插入:在二叉搜索树中插入新元素时,必须先检测该元素是否在树中已经存在。如果已经存在,则不进行插入;否则将新元素加入到搜索停止的地方。



非递归代码

int BSTreeNodeInsert(BSTreeNode **pptree,DataType x) //搜索树的插入
{
BSTreeNode *parent = NULL;
BSTreeNode *cur = *pptree;
if (*pptree == NULL)
{
*pptree = BuyTreeNode(x);
return 0;
}
while (cur)
{
parent = cur;
if (cur->_data > x)
cur = cur->_left;
else if (cur->_data < x)
cur = cur->_right;
else
return -1;
} if (parent->_data > x)
parent->_left = BuyTreeNode(x);
else
parent->_right = BuyTreeNode(x); return 0;
}

递归代码 :

int BSTreeNodeInsertR(BSTreeNode **tree,DataType x) //搜索树的插入
{
if(*tree == NULL)
{
*tree = BuyTreeNode(x);
return 0;
} if ((*tree)->_data > x)
return BSTreeNodeInsertR(&(*tree)->_left,x);
else if ((*tree)->_data < x)
return BSTreeNodeInsertR(&(*tree)->_right,x);
else
return -1;
}

2、搜索二叉树的查找

非递归代码

BSTreeNode *BSTreeNodeFind(BSTreeNode *tree,DataType x) //查找
{
while (tree)
{
if (tree->_data == x)
return tree;
else if (tree->_data < x)
tree = tree->_right;
else
tree = tree->_left;
} return NULL;
}

递归代码

BSTreeNode *BSTreeNodeFindR(BSTreeNode *tree,DataType x) //查找
{
if (!tree)
return NULL; if (tree->_data > x)
BSTreeNodeFindR(tree->_left,x);
else if (tree->_data < x)
BSTreeNodeFindR(tree->_right,x);
else
return tree;
}

3、搜索二叉树的删除

首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:

a. 要删除的结点无孩子结点

b. 要删除的结点只有左孩子结点

c. 要删除的结点只有右孩子结点

d. 要删除的结点有左、右孩子结点

情况1可以归类到2或者3

对于上述情况,相应的删除方法如下:

a. 直接删除该结点

b. 删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点

c. 删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点

d. 在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,在来处理该结点的删除问题

代码实现:

int BSTreeNodeDel(BSTreeNode **tree,DataType x) //删除
{ BSTreeNode *cur = *tree;
BSTreeNode *parent = *tree;
BSTreeNode *del = NULL; while (cur)
{
if (cur->_data > x)
{
parent = cur;
cur = cur->_left;
}
else if (cur->_data < x)
{
parent = cur;
cur = cur->_right;
}
else
{
del = cur; if (cur->_left == NULL) //1、左孩子为空
{
if (parent->_left == cur)
parent->_left = cur->_right;
else if (parent->_right == cur)
parent->_right = cur->_right;
else if (parent == cur) //没有父亲节点时
*tree = parent->_right;
}
else if (cur->_right == NULL) //2、右孩子为空
{
if (parent->_left == cur)
parent->_left = cur->_left;
else if (parent->_right == cur)
parent->_right = cur->_left;
else if (parent == cur) //没有父亲节点时
*tree = parent->_left;
}
else//3、左右孩子都不为空
{
BSTreeNode *sub = cur->_right;
while (sub->_left)
{
parent = sub;
sub = sub->_left;
} del = sub;
cur->_data = sub->_data; if (parent->_left == sub)
parent->_left = sub->_right;
else
parent->_right = sub->_right;
} free(del);
del = NULL;
return 0; }
} return -1;
}

完整代码请私信或者点此链接下载【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)的更多相关文章

  1. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  2. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  3. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  4. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  5. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  6. C++二叉树前中后序遍历(递归&非递归)统一代码格式

    统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...

  7. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  8. [javaSE] 数据结构(二叉树-遍历与查找)

    前序遍历:中,左,右 中序遍历:左,中,右 后序遍历:左,右,中 二叉树查找 从根节点进行比较,目标比根节点小,指针移动到左边 从根节点进行比较,目标比根节点大,指针移动到右边 /** * 前序遍历 ...

  9. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

随机推荐

  1. [知了堂学习笔记]_Jquery_Validate 表单校验的使用

    一.效果图: 二.JqueryValidate的好处 在做注册.或者类似以上的表单提交的时候,大家是不是都很烦那种,把数据拿到后台去判断, 可能经过了正则表达式之类的复杂判断,然后发现数据错误.接着通 ...

  2. ASPNET5 依赖注入(Dependency Injection)

    依赖注入一直是asp.net web框架(Web API,SignalR and MVC)中不可或缺的一部分,但是在以前,这个框架都是各自升级,都有各自的依赖注入实现方式,即使Katana项目想通过O ...

  3. 网口up不起来问题排查

    最近处理一个问题,发现有的网口up不起来.       ethtool eth6   Settings for eth6:   Supported ports: [ FIBRE ]   Support ...

  4. mysql视图定义、原理、创建、使用

    定义: 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并在引用视图时 ...

  5. Django 初识

    Django  初识 一.前言 Django是一款网站架构,能够快速的搭建一个网站.openstack的界面显示使用的就是Django的框架.所以,学习openstack多少要了解一些Django的内 ...

  6. python_如何使用临时文件

    案例: 某项目中,从传感器中获得采集数据,每收集到1G的数据后做是数据分析,最终只保留数据分析的结果,收集到的数据放在内存中,将会消耗大量内存,我们希望把这些数据放到一个临时的文件中 临时文件不能命名 ...

  7. linkinFrame--web应用举例--准备工作

    OK,前面的博客我们已经搭好了linkinFrame的项目结构,现在我们这里添加一个简单的web应用,在编写此web应用的过程中我们来一步一步的搭好自己的框架. 现在开始,这里举一个例子,一个客户的C ...

  8. Linux指令--cd,pwd

    本文参照博客做了修改和总结,感谢作者的分享.http://www.cnblogs.com/peida/archive/2012/10/24/2736501.html cd 命令可以说是Linux中最基 ...

  9. Oracle Start With关键字

    Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, ...

  10. 2018-01-28-M个本地工作点代码同步到N个GIT远端

    layout: post title: 2018-01-28-M个本地工作点代码同步到N个GIT远端 key: 20180128 tags: IT GIT modify_date: 2018-01-2 ...