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. 三星手机root后开启调试模式

    背景说明:三星手机高版本的手机进行root后也无法安装xposed,无法开启debuggable,使用androistdio无法进行调试. 1 .连接ddms无法显示正在运行的进程. 2.安装mpro ...

  2. easyUI datagrid 时间格式化

    从后台传过来的数据,其中含有日期字段,那么在前端的easyUI这里显示的话,会显得比较怪异,一大串,中间是个T,后面一大堆零,不知道是什么意思. 看来要进行格式化. 问题是,在哪里格式化? 如果在后端 ...

  3. JSON参数

    JSON(JavaScript Object Notation,JavaScript 对象表示法),多么简单,不就是键值对嘛. 可是每次在前后端之间通过json作为参数传递,我都心烦意乱,甚至吓到面无 ...

  4. ffmpeg-linux32-v3.3.1

    . imageio-binaries/ffmpeg at master · imageio/imageio-binaries · GitHub https://github.com/imageio/i ...

  5. struts2基础代码实现

    结构图: load.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  6. ios33--线程安全

    // // ViewController.m // 05-掌握-线程安全 // // 多线程下载文件:每个线程下的部分可能是交错的,到时候就拼接不了.除非每个线程下载的不是交错的,而是从头到尾依次分开 ...

  7. luogu 2622 关灯问题II

    题目大意: 有一些灯,有些开关可以控制这些灯,给出矩阵表示控制 对于矩阵中的a i j 表示第i个开关控制第j个灯的情况 若元素为1 表示当灯开着的时候,关掉灯 若元素为0 表示无操作 若元素为-1 ...

  8. [noip模拟赛]算算数

    https://www.zybuluo.com/ysner/note/1298755 题面 有一天小胡同学看到了一种表达式.这个表达式有四个变量\(A,B,C,D\).这四 个变量都只有\(0\)和\ ...

  9. JeePlus:目录

    ylbtech-JeePlus:目录 1.返回顶部 0. http://www.jeeplus.org/ 0.2.文档 http://wiki.jeeplus.org/docs/show/75 0.3 ...

  10. Mybatis 分页实现

    一.插件 PageHelper(推荐使用) 原理:利用Mybatis的拦截器,截获需要分页的sql语句,在语句后面加分页条件,及获取总记录数等属性. 注意 插件属性类 参考一 参考二 实例: 第一步: ...