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. 训练分类器 - 基于 PyTorch

    训练分类器 目前为止,我们已经掌握了如何去定义神经网络.计算损失和更新网络中的权重. 关于数据 通常来讲,当你开始处理图像.文字.音频和视频数据,你可以使用 Python 的标准库加载数据进入 Num ...

  2. 单线程的as-if-serial语义

    单线程的as-if-serial语义 关于指令重排序有个问题不明白的一个问题 int a = 2; int c = 1 + a; float b = 3f / 2f; 举个栗子,从CPU的设计者以及编 ...

  3. eNSP启动设备AR1失败记一次解决步骤

    eNSP稳定版本下载:   微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...

  4. Jmeter的Cookie管理器调试与参数化

     默认系统都是需要登录,才能操作其它接口,所以需要添加一个HTTP Cookie 管理器,默认Cookie管理器是关闭的,需要修改jmeter配置文件jmeter.properties,该文件在jme ...

  5. JMeter联机负载及问题解决

    主控制机:存放JMeter脚本的机器叫做主控制机 负载机:被连接并用来运行脚本的机器叫做负载机 操作步骤: 1.修改主控制机上,JMeter安装目录bin目录下的JMeter.properties文件 ...

  6. 重磅:保姆级Java技术图谱发布!够学到元宵节了,赶紧收藏!

    最近因为参与社群交流的时间比较多,除了唠唠白酒的嗑之外,很大一部分时间都是看到群里问到一些关于Spring Boot和Spring Cloud应用过程中碰到的问题以及一些开发过程中的报错信息.在这些帮 ...

  7. circus reload

    circus reload Configuration - Circus 0.15.0 documentation https://circus.readthedocs.io/en/latest/fo ...

  8. InnoDB 事务隔离级探索

    https://mp.weixin.qq.com/s/gWYL2Th9Go5LDhkyGB_rYQ

  9. 题解 UVA11694 【Gokigen Naname谜题 Gokigen Naname】

    题目 题解 考场上连暴力都不会打的码农题,深搜是真的难 /kk 前置问题 怎么输出"\" cout<<"\\"; 2.怎么处理不在一个环里,可以考虑 ...

  10. LOJ104 普通平衡树

    题目描述 这是一道模板题. 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入  x 数: 删除  x 数(若有多个相同的数,因只删除一个): 查询  x 数的排名(若 ...