二叉查找树C语言实现

1.      二叉查找树的定义:

左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树

2.      二叉查找树的最左边的结点即为最小值,要查找最小值,仅仅需遍历左子树的结点直到为空为止,同理,最右边的结点结尾最大值,要查找最大值,仅仅需遍历右子树的结点直到为空为止。二叉查找树的插入查找和删除都是通过递归的方式来实现的,删除一个结点的时候,先找到这个结点S,然后并非真正的删除这个结点S,而是在其右子树找到后继结点,将后继结点的值付给S,然后删除这个后继结点就可以。

3.      二叉查找树的C实现:

# include <iostream>
# include <cstdlib>
using namespace std; struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
}; TreeNode *insert(TreeNode *root,int val) //插入元素
{
if(root==NULL)
{
root=new TreeNode(val);
return root;
}
if(val<root->val)
root->left=insert(root->left,val);
if(val>root->val)
root->right=insert(root->right,val);
return root;
} TreeNode *findmin(TreeNode *root)
{
if(root==NULL)
return NULL;
if(root->left==NULL&&root->right==NULL)
return root;
if(root->left)
return findmin(root->left);
} bool find(TreeNode *root,int val) //查找元素,若存在返回1,不存在返回0
{
if(root==NULL)
return false;
if(root->val==val)
return true;
if(val<root->val)
return find(root->left,val);
else
return find(root->right,val);
return false;
} TreeNode *delnum(TreeNode *root,int val)
{
if(root==NULL)
return NULL;
if(val>root->val)
root->right=delnum(root->right,val);
else if(val<root->val)
root->left=delnum(root->left,val);
else
{
if(root->left&&root->right) //待删除结点有两个孩子的情形
{
TreeNode *tmp=findmin(root->right);
root->val=tmp->val;
root->right=delnum(root->right,tmp->val);
}
else //待删除结点仅仅有一个或者没有孩子
{
if(root->left==NULL)
root=root->right;
else if(root->right==NULL)
root=root->left;
}
}
return root;
} int main() //測试代码
{ TreeNode *root=NULL;
root=insert(root,3);
root=insert(root,2);
root=insert(root,4);
root=insert(root,1);
cout<<find(root,2)<<endl;
root=delnum(root,2);
cout<<find(root,2)<<endl;
system("pause");
return 0;
}

二叉查找树C语言实现的更多相关文章

  1. 数据结构:二叉查找树(C语言实现)

    数据结构:二叉查找树(C语言实现) ►写在前面 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 说明: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左子树上 ...

  2. 二叉查找树ADT--C语言描述

    首先给出此ADT的声明: struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree ...

  3. 数据结构学习:二叉查找树的概念和C语言实现

    什么是二叉查找树? 二叉查找树又叫二叉排序树,缩写为BST,全称Binary Sort Tree或者Binary Search Tree. 以下定义来自百度百科: 二叉排序树或者是一棵空树,或者是具有 ...

  4. 二叉查找树(一)之 图文解析 和 C语言的实现

    概要 本章先对二叉树的相关理论知识进行介绍,然后给出C语言的详细实现.关于二叉树的学习,需要说明的是:它并不难,不仅不难,而且它非常简单.初次接触树的时候,我也觉得它似乎很难:而之所产生这种感觉主要是 ...

  5. 深入浅出数据结构C语言版(12)——平衡二叉查找树之AVL树

    在上一篇博文中我们提到了,如果对普通二叉查找树进行随机的插入.删除,很可能导致树的严重不平衡 所以这一次,我们就来介绍一种最老的.可以实现左右子树"平衡效果"的树(或者说算法),即 ...

  6. 二叉查找树的C语言实现(二)

    接着上次的话题.这次我们要讨论,二叉查找树的中序遍历和后序遍历(递归和非递归),另外还有先序遍历(非递归) 1.中序遍历(递归) static void __in_order(struct bnode ...

  7. 二叉查找树的C语言实现(一)

    什么是二叉查找树? 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具 ...

  8. 二叉查找树(查找、插入、删除)——C语言

    二叉查找树 二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率.二叉查找树有以下性质: (1)若左子树不空,则左子树上所有节点的值均小于它的根节 ...

  9. 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)

    二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...

随机推荐

  1. HDU 4597 Play Game 2013 ACM-ICPC吉林通化全国邀请赛H题

    九野的博客,转载请注明出处:  http://blog.csdn.net/acmmmm/article/details/10833941 题意:给定T个测试数据,下面有2副牌,每副n张,每张都有一个分 ...

  2. Python批量删除指定目录下的指定类型的文件

    Python作为一种脚本语言.其很适合文件级的各种操作.以下的代码能够批量删除指定目录下的所有特定类型(CSV类型)的文件. import sys, csv , operator import os ...

  3. 最终结算“Git Windowsclient保存username与password”问题

    Git - How to use netrc file on windows - Stack Overflow 这就是正确答案,我们已经验证过了,以下具体描写叙述一下解决方法: 1. 在Windows ...

  4. Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客

    Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客 Nginx分时段限制下载速度解决方案(原创)    (2011-03-02 16:40:49)    转载▼    标签:    ngi ...

  5. [置顶] C++为什么是C++而不是++C

    来自<C++ primer> 问:C++为什么是C++而不是++C 答 :C++之名是Rick Mascitti在1983年夏天定名,c说明它的本质实在C语言演化而来的,”++“是C语言的 ...

  6. AW笔记本升级SSD,外接双屏中的一些注意事项

    自己留一个mark,以后提醒用. 1)机械硬盘状态下利用alien sprawn创建的系统恢复U盘,无法在SSD下使用,由于SSD中没有recovery分区,仅仅能使用随机携带的系统恢复光盘: 2)最 ...

  7. hdu1166(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树功能:update:单点增减 query:区间求和 #pragma comment(lin ...

  8. COLORREF和COLOR和RGB的总结

    一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...

  9. 【转】Acm之java速成

    这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入:格式为:Scanner cin = new Sca ...

  10. 关于静态与动态编译arm平台程序的比較

    因为近期弄个console程序,调用了readline,ncurses库,这两个动态库加起来有四百多k.而程序事实上非常小,其它地方也没使用到这两个库 所以想静态编译看看console程序有多大. # ...