二分查找树按照key值划分
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <cstdio>
#include <queue>
using namespace std; class TreeNode{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int v):val(v),left(nullptr),right(nullptr){}
}; TreeNode* buildBST(vector<int> &data,int s,int e){
TreeNode *root = nullptr;
if(s<=e) {
int mid = (s + e) / 2;
root = new TreeNode(data[mid]);
root->left = buildBST(data,s,mid-1);
root->right = buildBST(data,mid+1,e);
}
return root;
} bool checkBST(TreeNode *root){
if(root== nullptr){
return true;
}
int rootv = root->val;
bool isleft = true;
bool isright = true;
if(root->left){
isleft = rootv >=root->left->val? true:false;
isleft = isleft && checkBST(root->left);
}
if(root->right){
isright = rootv < root->right->val? true:false;
isright = isright && checkBST(root->right);
}
return isleft&&isright;
} void printBST(TreeNode *root){
deque<TreeNode*> myd;
myd.push_back(root);
int num = 1;
int nextlineNumbers = 0;
while(!myd.empty()){
while(num--){
TreeNode *t = myd[0];
if(t->left){
nextlineNumbers++;
myd.push_back(t->left);
}
if(t->right){
nextlineNumbers++;
myd.push_back(t->right);
}
cout<<t->val<<" ";
myd.pop_front();
}cout<<endl;
num = nextlineNumbers;
nextlineNumbers = 0;
}//while
} /*根据bst的性质,我们只需要对树的边界边调整即可,
* 树的边界边分为下面两种;
> //大于key
/
/
<= //小于等于key
后者是
<= //小于等于key
\
\
> //大于key
* */
//我当时卡在了BST树的性质对于这道题的认知,
//对root节点的左子树中所有的节点值都比root节点小
//对root节点的右子树中所有的节点值都比root节点大
//将边界边切开,分为左右两个树,按照性质,只需要对两棵树其中的一课继续做拆分操作即可。
vector<TreeNode*> splitByKey(TreeNode *root,int key){
vector<TreeNode*> re;
TreeNode *r1,*r2;//分别指向被拆开得新bst树的,左侧部分和右侧部分;
r1 = r2 = nullptr;
if(root== nullptr){//对于叶子节点来说,查分完后的两部分都是nullptr
re.push_back(nullptr);
re.push_back(nullptr);
return re;
}
TreeNode *curr = root;//当前访问节点,为了找到被分割的临界边,指向临界边的“上节点”
while(curr->val<=key && curr->right){//将curr节点向右下划行
if(curr->right->val > key){
break;
}
curr= curr->right;
} while(curr->val > key && curr->left){//将curr节点向左下划行
if(curr->left->val <= key){
break;
}
curr = curr->left;
}
if(curr->val <= key){
r1 = root;
r2 = curr->right;
curr->right = nullptr;
if(r2!= nullptr){
vector<TreeNode*> t = splitByKey(r2,key);
curr->right = t[0];
r2 = t[1];
}
}else{
r1 = curr->left;
r2 = root;
curr->left = nullptr;
if(r1!= nullptr){
vector<TreeNode*> t = splitByKey(r1,key);
curr->left = t[1];
r1 = t[0];
}
}
re.push_back(r1);
re.push_back(r2);
return re;
} int main(){
vector<int> data;
for(int i = 0;i<10;i++){
data.push_back(i);
} TreeNode *root = buildBST(data,0,data.size()-1);
printBST(root);
cout<<"=========="<<endl;
vector<TreeNode*> re = splitByKey(root,5);
printBST(re[0]);
cout<<"check left bst: "<<checkBST(re[0])<<endl;
cout<<"==="<<endl;
printBST(re[1]);
cout<<"check right bst: "<<checkBST(re[1])<<endl;
return false;
}
二分查找树按照key值划分的更多相关文章
- Go 数据结构--二分查找树
Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...
- 手把手教你用java实现二分查找树及其相关操作
二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- lintcode-106-排序列表转换为二分查找树
106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...
- SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)
题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...
- python数据结构之树(二分查找树)
本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增.删.查的操作. 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是 ...
- Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化
题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$ $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...
- 51nod1287(二分/线段树区间最值&单点更新)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 题意:中文题诶- 解法1:b[i] 存储 max(a[0 ...
- js二分查找树实现
function BinaryTree() { var Node = function(key) { this.key = key; this.left = null; this.right = nu ...
随机推荐
- CentOS上安装mongodb
安装mongodb pymongo修改yum源vi /etc/yum.repos.d/10gen.repo[10gen]name=10gen Repositorybaseurl=http://down ...
- Linux查看CPU和内存使用情况[转]
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- Spring注解@Value数值取值转换字符串失败
配置文件(yml)中,配置项如下: cebconfig: INST_CODE: 08801001 SFT_NOTIFY_CEB_CHANNEL: 123456 期望INST_CODE: 0880100 ...
- 洛谷P1762 偶数(找规律)
题目描述 给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 输入输出格式 输入格式: 一个数 输出格式: 结果 输入输出样例 输入样例#1: 复制 6 输出样例#1: ...
- Servlet学习笔记01——什么是servlet?
1.什么是Servlet? sun公司制订的一种用来扩展web服务器功能的组件规范. (1)扩展web服务器功能 早期的web服务器(apache web server,iis) 只能处理静态资源的请 ...
- LEA指令与MOV指令区别
Tips: LEA指令与MOV指令的区别: ① MOV指令是 数据 传送指令-------传送数据 LEA指令是 有效地址 传送指令-------取偏移地址 ② MOV OPRD1 ...
- Ubuntu 18.04 配置
Ubuntu 18.04 配置IP-静态(UB与其他linux os不同) sudo netplan generate sudo vim /etc/netplan/50-cloud-init.yaml ...
- Apache Maven(二):构建生命周期
Maven 约定的目录结构 我要遵循Maven已经约定好的目录结构,才能让maven在自动构建过程中找到对应的资源进行构建处理.以下是maven约定的目录结构: 项目名称 |-- pom.xml :M ...
- 天气预报api-汇总
和风天气 https://www.heweather.com/
- vim编辑器使用习惯问题
Ubuntu中vi在编辑状态下方向键不能用,一按方向键盘就出ABCD,想插入个字母还非常麻烦,还有回格键不能删除等我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full ...