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. 物理STANDBY库创建还原点(打开为read write后再变回主库)

    开启STANDBY库为READ WRITE 1.取消主库传送归档 SQL> alter system set log_archive_dest_state_2=defer; 2.取消备库应用日志 ...

  2. Spring Aop中四个重要概念,切点,切面,连接点,通知

    1. 通知: 就是我们编写的希望Aop时执行的那个方法.我们通过Aop希望我们编写的方法在目标方法执行前执行,或者执行后执行.2. 切点:切点就是我们配置的满足我们条件的目标方法.比如我们规定:名字前 ...

  3. uni-app开发经验分享六:页面跳转及提示框

    在我们开发的uni-app的过程中,页面跳转及提示框往往是我们做数据交互及结果反馈所要使用的功能,这里分享下我收集的一些方法及看法. 一:页面跳转 事件跳转 :指通过tap等事件来实现页面的跳转,跳转 ...

  4. 简单明朗的 RNN 写诗教程

    目录 简单明朗的 RNN 写诗教程 数据集介绍 代码思路 输入 and 输出 训练集构建 生成一首完整的诗 代码实现 读取文件 统计字数 构建word 与 id的映射 转成one-hot代码 随机打乱 ...

  5. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  6. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...

  7. GDB 简单学习

    一般来说,GDB主要帮忙你完成下面四个方面的功能:       1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序.     2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条 ...

  8. LOJ10082

    题目描述 原题来自:Centrual Europe 2005 我们有N个字符串,每个字符串都是由 a 至 z 的小写英文字母组成的.如果字符串A的结尾两个字符刚好与字符串B的开头两个字符匹配,那么我们 ...

  9. Spring听课笔记(专题二下)

    第4章 Spring Bean基于注解的装配 4.1 Bean的定义及作用域的注解实现 1. Bean定义的注解 -- @Component是一个通用注解,可用于任何bean -- @Reposito ...

  10. HDU-6703 array (线段树)

    题意 一个长度为n的排列a,\(\forall i\in [1,n] ,1\le a_i \le n\) , m次操作,每次操作: (1,pos),把 \(a_{pos}\) 变为\(a_{pos} ...