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. ios获取缓存文件的大小并清除缓存

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  2. JavaScript中的构造函数和原型!

    JavaScript中的原型! 原型的内容是涉及到JavaScript中的构造函数的 每一个构造函数都有一个原型对象!prototype 他的作用是 共享方法!还可以扩展内置对象[对原来的内置对象进行 ...

  3. 如何在Redis中实现事务

    如何在Redis中实现事务 - 微店技术团队 - SegmentFault 思否 https://segmentfault.com/a/1190000007429197

  4. Go for Pythonistas Go and the Zen of Python 禅

    Go for Pythonistas https://talks.golang.org/2013/go4python.slide#1 Things I don't like about Python ...

  5. UI自动化测试实战

    前言 前面我们已经搭建好了wordpress网站,如果需要查看运行效果可以看我前面的搭建文章,下面我们来进行自动化测试的练习. 示例 首先我们测试自动登陆 import unittest from s ...

  6. 洛谷P4317

    Description 定义 \(sum(i)\) 表示 \(i\) 的二级制中 1 的个数 给定一个 N,求 \(\prod_{i=1}^N sum(i)\) Solution 显然是数位 DP 考 ...

  7. 济南学习D1T5__HEAP

    死亡 [问题描述] 现在有个位置可以打sif,有个人在排队等着打sif.现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif.(前个人必须按照顺序来) [输入格式] 第一行两个 ...

  8. Java进阶专题(二十二) 从零开始搭建一个微服务架构系统 (上)

    前言 "微服务"一词源于 Martin Fowler的名为 Microservices的,博文,可以在他的官方博客上找到http:/ /martinfowler . com/art ...

  9. ipython和jupyter安装

    ipython pip install ipython pip install --upgrade pip jupyter pip install jupyter 查看token: jupyter n ...

  10. UML——活动图

    宏观导图 是森马?   活动图,属于UML中动态建模工具图,它描述活动的顺序,展现从一个活动到另一个活动的控制流.活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程.   其实,说白了 ...