https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2

BST

假设已经给定树节点的结构不可修改。

然后输入是按照层次顺序

怎样创建BST?

1. 当input number较小时,先把输入的数存到数组里,然后从第一个数开始递归创建即可,(左孩子2K,右孩子2K+1)

或者用指针数组,存当前层的节点,然后插入其孩子,得到下一层的所有节点,然后再插入下下层。

2.当number很大 2^20-1时,就不太合适了。思路为用 int path[21]数组存储当前点路径 。假设根节点编号为1,当前要插入第13个数,就先求得13,6,3,1放到path数组里,到1然后1,3,6,13找到位置插入这个点。

创建并判断BST(number较小的情况)

#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std; // Definition for a binary tree node.
struct TreeNode {
int val;
int max; // maximum value of the subtree from this node
int min; // minimum value of the subtree from this node
int num; // number of the node
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), max(NULL), min(NULL), left(NULL), right(NULL), num(NULL) {}
TreeNode() : val(NULL), max(NULL), min(NULL), left(NULL), right(NULL), num(NULL){}
}; bool is_BST(TreeNode* root){
if (root->left == NULL&&root->right == NULL) {
return true;
}
if (is_BST(root->left) && is_BST(root->right) ) {
if(root->left->max==0)
{
if(root->right->min==0)
return true;
else if(root->right->min> root->val)
return true;
else return false;
}
else{
if(root->left->max < root->val)
{
if(root->right->min==0)
return true;
else if(root->right->min> root->val)
return true;
else return false;
}
else
return false; } }
else {
return false;
} } void buildnode(TreeNode* root, int A[], int n) {
if (2 * root->num <= n) {
root->left = new TreeNode;
root->left->val = A[2 * root->num - 1];
root->left->num = 2 * root->num; root->right = new TreeNode;
root->right->val = A[2 * root->num];
root->right->num = 2 * root->num + 1;
}
else {
return;
} buildnode(root->left, A, n);
buildnode(root->right, A, n);
} int fillmax(TreeNode* root) {
if (root->right == NULL) {
root->max = root->val;
return root->max;
}
else {
root->max = max(max(fillmax(root->right), root->val), fillmax(root->left));
return root->max;
} }
int fillmin(TreeNode* root) {
if (root->left == NULL) {
root->min = root->val;
return root->min;
}
else {
if (root->left->val == 0 && root->right->val != 0) {
root->min = min(root->val, fillmin(root->right));
}
if (root->left->val != 0 && root->right -> val == 0) {
root->min = min(root->val, fillmin(root->left));
}
if (root->left->val == 0 && root->right -> val == 0) {
root->min = root->val;
}
      if (root->left->val != 0 && root->right -> val != 0) {
            root->min = min(min(root->val, fillmin(root->left)), fillmin(root->right));
        }
return root->min;
} } void printtree(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->min<<endl;
printtree(root->left);
printtree(root->right);
if (root->left == NULL || root->right == NULL) {
return;
}
} void SolveD() {
TreeNode* root = new TreeNode;
int n;
cin >> n;
int* valarray = new int[n];
int value;
for (int i = 0; i <= (n - 1); i++) {
cin >> value;
valarray[i] = value;
}
root->val = valarray[0];
root->num = 1;
buildnode(root, valarray, n);
fillmin(root);
fillmax(root);
//printtree(root);
if (is_BST(root)) {
cout << "true";
return;
}
else {
cout << "false";
return;
} return;
} int main() {
SolveD();
system("pause");
return 0;
}

这是复杂但是符合题目要求的方法。

还可以直接递归

/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode *root) {
return isValidBST(root, INT_MIN, INT_MAX);
}
bool isValidBST(TreeNode *root, int low, int high){
if (root == NULL )
return true;
if (low < root->val && root->val < high)
return (isValidBST(root->left, low, root->val) && isValidBST(root->right, root->val, high));
else
return false;
}
};

或者先序遍历

/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode *root) {
vector<int> res;
isValidBST(root, res);
int len = res.size();
bool flag = true;
for (int i=0; i<len-1; i++){
if (res[i] >= res[i+1]){
flag = false;
break;
}
}
return flag;
}
void isValidBST(TreeNode *root, vector<int> &res){
if (root == NULL)
return; isValidBST(root->left, res);
res.push_back(root->val);
isValidBST(root->right, res);
}
};

按层次顺序创建二叉树;判断BST的更多相关文章

  1. 剑指Offer-按之字形顺序打印二叉树

    package Tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** * ...

  2. 非递归创建二叉树( C++队列 )

    非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...

  3. ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。

    Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...

  4. 【剑指Offer】59、按之字形顺序打印二叉树

      题目描述:   请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   解题思路:   这道题仍然是二 ...

  5. 用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数

    本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正 首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可 ...

  6. 剑指offer---3、按之字形顺序打印二叉树

    剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...

  7. Java创建二叉树、二叉树的遍历

    创建二叉树: public class Node {     // 左子节点     public Node leftNode;     // 右子节点     public Node rightNo ...

  8. 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)

    [剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  9. YTU 3025: 创建二叉树

    原文链接:https://www.dreamwings.cn/ytu3025/2628.html 3025: 创建二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 3 ...

随机推荐

  1. Java中的Date类型无法赋值给数据库的datetime类型

    因为Java中new Date()的结果是"Thu Aug 27 19:03:54 CST 2020",而mysql中的datetime不接受这样的日期格式,插入数据会报错. 解决 ...

  2. 转 Jmeter测试实践:文件下载接口

    Jmeter测试实践:文件下载接口   一 Jmeter步骤 1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求.根据接口文档进行配置. Basic ...

  3. 大数据谢列3:Hdfs的HA实现

    在之前的文章:大数据系列:一文初识Hdfs , 大数据系列2:Hdfs的读写操作 中Hdfs的组成.读写有简单的介绍. 在里面介绍Secondary NameNode和Hdfs读写的流程. 并且在文章 ...

  4. kvm实战

    1. 安装环境 # yum install qemu-kvm libvirt virt-install virt-manager virt-viewer -y # systemctl start li ...

  5. hive报错:Failed with exception java.io.IOException: rename for src path:

    在hive中,会有这样一种情形: 1.创建一个分区外部表A(比如A表有5个字段),并且向A表里指定的分区(比如20160928这个分区)里插入数据 2.发现A表缺少一些字段,因为存在元数据不实时更新的 ...

  6. 解析MySQL中存储时间日期类型的选择问题

    解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...

  7. 风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf

    风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf

  8. Why should I avoid blocking the Event Loop and the Worker Pool?

    Don't Block the Event Loop (or the Worker Pool) | Node.js https://nodejs.org/en/docs/guides/dont-blo ...

  9. 小鹏汽车技术中台实践 :微服务篇 InfoQ 今天 以下文章来源于InfoQ Pro

    小鹏汽车技术中台实践 :微服务篇 InfoQ  今天 以下文章来源于InfoQ Pro

  10. 编写Hello World ts程序

    准备工作 预装软件NodeJs和VSCode 新建文件夹ts_in_action npm命令初始化工程:npm init -y,生成package.json文件 全局安装TypeScript:npm ...