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. Wget下载多个链接

    需要wget下载多个文件链接时,可以采用如下方法: 1. 将链接存入文件url.list中: 2. wget -bc -i url.list -o [log_file] -P [target_dir] ...

  2. nginxserver报403 forbidden错误的解决的方法

     改动nginx.config文件内容: location / {             #root   html;             root   D:\java;            ...

  3. JS的内存空间

    变量对象与引用数据 概念解释 对于基本数据类型Undefined.Null.Boolean.Number.String往往保存在变量对象中 而对于引用数据类型,如Array.String.Object ...

  4. go16---select

    package main /* Channel Channel 是 goroutine 沟通的桥梁, goroutine是通过通信来进行内存的共享, 而不是通过内存的共享来进行通信,通过Channel ...

  5. sql compare options

    sql compare project's options Add object existence checks Use DROP and CREATE instead of ALTER Ignor ...

  6. ubuntu安装wine 安装QQ

    安装最新版 wine sudo dpkg --add-architecture i386 sudo add-apt-repository ppa:wine/wine-builds sudo apt-g ...

  7. Tensorflow学习笔记——张量、图、常量、变量(一)

    1 张量和图 TensorFlow是一种采用数据流图(data flow graphs),用于数值计算的开源软件库.其中 Tensor 代表传递的数据为张量(多维数组),Flow 代表使用计算图进行运 ...

  8. git 查看、切换用户

    查看命令: 查看用户名: git config user.name 查看用户邮箱: git config user.email 修改命令: 修改用户名: git config --global use ...

  9. STM32: TIMER门控模式控制PWM输出长度

    搞了两天单脉冲没搞定,无意中发现,这个利用主从模式的门控方式来控制一路PWM的输出长度很有效. //TIM2 PWM输出,由TIM4来控制其输出与停止 //frequency_tim2:TIM2 PW ...

  10. P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)

    传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ...