#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值划分的更多相关文章

  1. Go 数据结构--二分查找树

    Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...

  2. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  3. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  4. lintcode-106-排序列表转换为二分查找树

    106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...

  5. SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

    题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...

  6. python数据结构之树(二分查找树)

    本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增.删.查的操作. 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是 ...

  7. Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化

    题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$  $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...

  8. 51nod1287(二分/线段树区间最值&单点更新)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 题意:中文题诶- 解法1:b[i] 存储 max(a[0 ...

  9. js二分查找树实现

    function BinaryTree() { var Node = function(key) { this.key = key; this.left = null; this.right = nu ...

随机推荐

  1. CDH4.5.0下安装snappy

    编译源代码 http://www.cnblogs.com/chengxin1982/p/3862289.html 测试参考 http://blog.jeoygin.org/2012/03/java-c ...

  2. 创建git及其初始化

    创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: $ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit 初始化一个 ...

  3. Mybatis查询报错:There is no getter for property named '*' in 'class java.lang.String

    问题: 执行查询时报错:There is no getter for property named '*' in 'class java.lang.String 原因: 传过去的参数为识别.本例为 p ...

  4. java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重

    package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...

  5. Linux nohup 关闭终端的时候,程序依然能在后台运行( linux重定向及nohup不输出的方法)

    先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出.在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号 ...

  6. Linux平台下安装MySQL

    1.下载RPM包 http://dev.mysql.com/downloads/mysql/5.5.html#downloads 选择[Red Hat & Oracle Enterprise ...

  7. 机器学习实战 -- 决策树(ID3)

    机器学习实战 -- 决策树(ID3)   ID3是什么我也不知道,不急,知道他是干什么的就行   ID3是最经典最基础的一种决策树算法,他会将每一个特征都设为决策节点,有时候,一个数据集中,某些特征属 ...

  8. tar命令,vi编辑器

    一.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖): [root@localhost /]# cat /etc/passwd /etc/group > 1.txt ...

  9. spark stream简介

    1.复杂的迭代计算 假如我们计算的需要100步的计算,但是当我执行到第99步的时候,突然数据消失, 根据血统,从头进行恢复,代价很高 sc.setCheckpointDir("共享存储文件系 ...

  10. spark中的RDD以及DAG

    今天,我们就先聊一下spark中的DAG以及RDD的相关的内容 1.DAG:有向无环图:有方向,无闭环,代表着数据的流向,这个DAG的边界则是Action方法的执行 2.如何将DAG切分stage,s ...