Date:2019-06-25 14:40:32

基本操作

  • 注意:数据量较大时,插入建树的时间复杂度会很高,慎用!
 //查找
void Search(node *root, int x)
{
if(root == NULL)
{
printf("search failed\n");
return;
}
if(x == root->data)
printf("%d\n", root->data);
else if(x < root->data)
Search(root->lchild, x);
else if(x > root->data)
Search(root->data)
Search(root->rchild, x);
} //插入
void Insert(node *root, int x)
{
if(root == NULL)
{
root = newNode(x); //新建结点
return;
}
if(x == root->data)
return;
else if(x > root->data)
Insert(root->rchild, x);
else if(x < root->data)
Insert(root->lchild, x);
} //建立
node* Create(int data[], int n)
{
node *root = NULL;
for(int i=; i<n; i++)
Insert(root, data[i]); return root;
} //删除 //寻找前驱
node* FindMax(node *root)
{
while(root->rchild != NULL)
root = root->rchild;
return root;
} //寻找后继
node* FindMin(node *root)
{
while(root->lchild != NULL)
root = root->lchild;
return root;
} //删除结点root
void Delete(node *&root, int x)
{
if(root == NULL)
return;
if(root->data == x)
{
if(root->lchild==NULL & root->rchild==NULL) //叶子结点直接删除即可
root = NULL;
else if(root->lchild != NULL)
{
node *pre = FindMax(root->lchild); //寻找左子树的最大值(最右结点)
root->data = pre->data; //与被删除结点替换
Delete(root->lchild, pre->data); //删除替换后的结点
}
else if(root->rchild != NULL)
{
node *pre = FindMin(root->rchild); //寻找右子树的最小值(最左结点)
root->data = pre->data;
Delete(root->rchild, pre->data);
}
}
else if(x < root->data)
Delete(root->lchild, x);
else if(x > root->data)
Delete(root->rchild, x);
}

删除优化

  • 删除操作中,找到替换结点后,该结点就是接下来需要删除的结点,直接删除即可
  • 目前PAT考试中还没有考察过删除结点相关的算法
 #include<stdio.h>
const int M = ;
const int data[M] = {,,,,,,,,,}; struct node
{
int data;
node *lchild, *rchild;
}; node* FindMax(node *root)
{
while(root->rchild->rchild)
root = root->rchild;
return root;
} node *FindMin(node *root)
{
while(root->lchild->lchild)
root = root->lchild;
return root;
} void BST(node *&root, int x)
{
if(!root)
{
root = new node;
root->data = x;
root->lchild = NULL;
root->rchild = NULL;
return;
}
if(x == root->data)
{
if(!root->lchild && !root->rchild)
root = NULL;
else if(root->lchild)
{
node *pre;
if(root->lchild->rchild == NULL)
{
pre = root->lchild;
root->lchild = pre->lchild;
}
else
{
node *fa = FindMax(root->lchild);
pre = fa->rchild;
fa->rchild = pre->lchild;
}
root->data = pre->data;
delete(pre);
}
else if(root->rchild)
{
node *pre;
if(root->rchild->lchild == NULL)
{
pre = root->rchild;
root->rchild = pre->rchild;
}
else
{
node *fa = FindMin(root->rchild);
pre = fa->rchild;
fa->rchild = pre->lchild;
}
root->data = pre->data;
delete(pre);
}
}
else if(x < root->data)
BST(root->lchild, x);
else if(x > root->data)
BST(root->rchild, x);
} void Traverse(node *root)
{
if(root == NULL)
return;
Traverse(root->lchild);
printf("%d ", root->data);
Traverse(root->rchild);
} node* Create()
{
node *root = NULL;
for(int i=; i<M; i++)
BST(root, data[i]); return root;
} int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("Test.txt", "r", stdin);
#endif // ONLINE_JUDGE node *root = Create();
Traverse(root);
printf("\n");
BST(root, );
Traverse(root); return ;
}

二叉查找树(Binary Search Tree)的更多相关文章

  1. 二叉查找树(binary search tree)详解

    二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...

  2. 算法与数据结构基础 - 二叉查找树(Binary Search Tree)

    二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...

  3. 【LeetCode】二叉查找树 binary search tree(共14题)

    链接:https://leetcode.com/tag/binary-search-tree/ [220]Contains Duplicate III (2019年4月20日) (好题) Given ...

  4. 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree

    二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表. 操作 Map()新建一个空的映射. put(key, val)往映射中加入一个新的键-值对.如果键已经 ...

  5. 数据结构之Binary Search Tree (Java)

    二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...

  6. 二叉搜索树(Binary Search Tree)(Java实现)

    @ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  7. 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】

    本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

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

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

  9. 【LeetCode】Validate Binary Search Tree 二叉查找树的推断

    题目: Given a binary tree, determine if it is a valid binary search tree (BST). 知识点:BST的特点: 1.一个节点的左子树 ...

  10. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

随机推荐

  1. 【hdu3966】Aragorn's Story

    题意:给一棵树,并给定各个点权的值,然后有3种操作:I C1 C2 K: 把C1与C2的路径上的所有点权值加上KD C1 C2 K:把C1与C2的路径上的所有点权值减去KQ C:查询节点编号为C的权值 ...

  2. ssh服务常见问题及其解决办法

    1 统一解决办法 执行sshd -t,这样就可以指出是哪里出问题了. 所有的服务都应该有这个测试选项,否则出错了都不知道在哪里出的问题. 2 root用户登录,密码是对的,但是报“Permission ...

  3. 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)

    利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...

  4. 洛谷 P2577 [ ZJOI 2005 ] 午餐 —— DP + 贪心

    题目:https://www.luogu.org/problemnew/show/P2577 首先,想一想可以发现贪心策略是把吃饭时间长的人放在前面: 设 f[i][j] 表示考虑到第 i 个人,目前 ...

  5. python 操作数据库时遇到的错误

       pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; ch    之前的写法是从文件里 ...

  6. yii框架下jquery在ajax更新后失效问题

    解决方案,以live的形式重新绑定一次, /***回复隐藏收起效果***/ $(".btn-reply").live('click',function(event){ var da ...

  7. 设置VMWare虚拟机使拷贝虚拟机后固定原有的IP地址

    VMWare中已经安装并设置好的虚拟机在拷贝给别人后,再次打开该虚拟机时原有自动获取的IP地址将会变化,那么原有根据该IP地址进行的设置均将失效,还需要重新设置,比较麻烦,经过百度查询原来可以将虚拟机 ...

  8. python如何添加浏览器驱动路径

    闲来无事,整一整python+selenium,写完代码后运行发现找不到webdriver的路径:之前是仿照java一样直接把webdriver放到浏览器的安装目录下 迫于无奈,只好查一下问题如何处理 ...

  9. 转】 mysql5.6.12 for Linux安装

    原博文出自于: http://blog.csdn.net/book_mmicky/article/details/25714049 感谢! 1:上www.mysql.org下载64位版本mysql5. ...

  10. mysql之命令行导入导出

    命令介绍 mysqldump:导出命令,在系统”命令提示符“窗口直接使用,如果提示没有此命令(前提是已经安装成功mysql),在环境变量中的path添加mysql,即path=D:\xxx\mysql ...