二叉查找树(Binary Search Tree)
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)的更多相关文章
- 二叉查找树(binary search tree)详解
二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...
- 算法与数据结构基础 - 二叉查找树(Binary Search Tree)
二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...
- 【LeetCode】二叉查找树 binary search tree(共14题)
链接:https://leetcode.com/tag/binary-search-tree/ [220]Contains Duplicate III (2019年4月20日) (好题) Given ...
- 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree
二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表. 操作 Map()新建一个空的映射. put(key, val)往映射中加入一个新的键-值对.如果键已经 ...
- 数据结构之Binary Search Tree (Java)
二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...
- 二叉搜索树(Binary Search Tree)(Java实现)
@ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...
- 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】
本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)
二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...
- 【LeetCode】Validate Binary Search Tree 二叉查找树的推断
题目: Given a binary tree, determine if it is a valid binary search tree (BST). 知识点:BST的特点: 1.一个节点的左子树 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
随机推荐
- C/C++生成可执行文件过程
编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序.编译的 ...
- python partial
1 很好记忆 partial的第一个参数是函数,后面都是该函数的参数. 2 特殊的地方 partial第一个参数是函数名,但是第二个参数是另外一个函数名. 比如partial(filter, func ...
- springMVC之异常处理
1. 自己定义一个异常类: UserException.java public class UserException extends RuntimeException { private stati ...
- Windows10 Win键失灵的解决方法
之前在Windows10出来的时候在使用过程中发现:按“Win键”调出开始菜单没有用.一点反应都没有.Win+R等这样的组合键也没用. 后来周年更新后,还是无法使用... 各种方法用尽啊.都不行啊! ...
- npm安装以及命令行
安装visual studio的时候,安装Node.js会同时安装npm 查看版本 PS C:\Users\clu\Desktop> npm --version5.6.0 PS C:\Users ...
- 洛谷 P1573 栈的操作
题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,-,n.每一个栈只支持一种操作:弹出并压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操 ...
- bzoj3670 [Noi2014]动物园——KMP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 第一次写KMP算法...又T又WA了半天... 1. num 数组表示包括其本身的前缀 ...
- Enum类的非一般用法汇总(工作中遇到时持续更新)
1. 每个枚举实例定义一套自己的方法示例: 1 @AllArgsConstructor 2 public enum BroadcastTypeEnum { 3 ALL(0, "全站&quo ...
- [Swift通天遁地]一、超级工具-(18)创建强大、灵活的日期时间拾取器
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Nginx(三) 常用配置整理
#定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...