按层次顺序创建二叉树;判断BST
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;
}
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的更多相关文章
- 剑指Offer-按之字形顺序打印二叉树
package Tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** * ...
- 非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...
- ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。
Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...
- 【剑指Offer】59、按之字形顺序打印二叉树
题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路: 这道题仍然是二 ...
- 用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数
本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正 首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可 ...
- 剑指offer---3、按之字形顺序打印二叉树
剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...
- Java创建二叉树、二叉树的遍历
创建二叉树: public class Node { // 左子节点 public Node leftNode; // 右子节点 public Node rightNo ...
- 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)
[剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- YTU 3025: 创建二叉树
原文链接:https://www.dreamwings.cn/ytu3025/2628.html 3025: 创建二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 3 ...
随机推荐
- mount: /dev/sdxx already mounted or /xxxx busy解决方法
异常现象: 解决方法: 1. 輸入root的密碼,進入單用戶2. 重新掛載/目錄,使其變為可讀可寫 # mount –o rw,remount / 3. 修改/etc/fstab文件 ...
- BAPI_SALESORDER_CREATEFROMDAT2 条件 定价元素
用函数 BAPI_SALESORDER_CREATEFROMDAT2创建SO的时候,遇见个问题,就是如图: 会多出来一个类型,搞了半天,发现是一个函数里的一个参数,我没有设置: LOGIC_SWITC ...
- Spring集成GuavaCache实现本地缓存
Spring集成GuavaCache实现本地缓存: 一.SimpleCacheManager集成GuavaCache 1 package com.bwdz.sp.comm.util.test; 2 3 ...
- Nginx基础环境搭建
1.下载docker toolbox https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 2.选择好安装目录 一路nex ...
- python爬虫如何提高效率
开启线程池: 线程池 asyncio 特殊的函数 协程 任务对象 任务对象绑定 事件循环 from multiprocessing.dummy import Pool map(func,alist): ...
- 电脑打不开gitHub的解决方法
电脑打不开gitHub的解决方法 方法:修改本地的hosts文件 因为Github是国外网站,所以经常会遇到打不开的问题,并且有时能打开但是网速好慢 解决这个问题的方法是 : C:\Windows ...
- OpenSSL 常见对称加密算法特性分析
在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢? 对于加密方式.算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高. 现在主流的加密协议的安全性均能 ...
- vue-router实现路由懒加载( 动态加载路由 )
三种方式第一种:vue异步组件技术 ==== 异步加载,vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 .但是,这种情况下一个组件生成一个js文件.第二种:路由懒加载 ...
- Coded UI
Coded UI Test是Visual Studio 2010对于Testing Project(测试工程)提供的关于UI自动化测试的框架,支持Win32,Web,WPF等UI的自动化测试,是一个非 ...
- Spring 设计模式介绍
JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远.所以,花了 ...