判断给定的二叉树是否为二分查找树。假设树的每个节点以整数为键值,且不同节点的键值互不相等。二分查找树成立的判定条件:
对任何非叶子节点A,如果A存在左子树,则A的键值大于其左子树所有节点的键值,且,如果A存在右子树,则A的键值小于其右子树所有节点的键值
判断给定的二叉树是否为二分查找树。假设树的每个节点以整数为键值,且不同节点的键值互不相等。二分查找树成立的判定条件:
对任何非叶子节点A,如果A存在左子树,则A的键值大于其左子树所有节点的键值,且,如果A存在右子树,则A的键值小于其右子树所有节点的键值
第一行:根节点键值;
第二行开始,二叉树的结构,每行代表一组根节点与左右子节点的对应关系,-1代表空节点。格式:
根节点键值:左子节点键值|右子节点键值
例如,
5:3|-1
表示键值为5的节点,左子节点的键值为3,右子节点为空节点
假设:所有节点的键值非负,且不超过1023
判断结果,0表示输入不是二分查找树,1表示输入是二分查找树
5 5:4|7 4:3|8 7:2|-1 3:-1|-1 8:-1|-1 2:-1|-1
0
#include <stdio.h>
#include <stdlib.h>
#define INF 0x3F3F3F3F
#define IsValidBST(infos, key) __IsValidBST(infos, key, -INF, +INF)
// ========== 二叉树节点信息表 ==========
typedef int Key;
typedef struct {
Key key;
Key l_child, r_child;
} BST_NODE_INFO, *INFO;
// ========== 二叉树节点信息表 ==========
int __IsValidBST(INFO infos, Key key, Key low, Key high) {
if (key == -1) return 1;
return key > low && key < high
&& __IsValidBST(infos, (infos + key)->l_child, low, key)
&& __IsValidBST(infos, (infos + key)->r_child, key, high);
}
int main(const int argc, const char* const argv[]) {
BST_NODE_INFO infos[1000];
Key root_key;
fscanf(stdin, "%d", &root_key);
Key fa, l_ch, r_ch;
while (fscanf(stdin, "%d:%d|%d", &fa, &l_ch, &r_ch) != EOF) {
(infos + fa)->key = fa;
(infos + fa)->l_child = l_ch;
(infos + fa)->r_child = r_ch;
}
return fprintf(stdout, "%d\n", IsValidBST(infos, root_key)), 0;
} import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val){
this.val = val;
left = null;
right = null;
}
}
public class Main {
static ArrayList<Integer> inorderSeq = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int nodeKey = Integer.parseInt(br.readLine().trim());
// 重构二叉树
TreeNode tree = new TreeNode(nodeKey);
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(tree);
while(!queue.isEmpty()){
TreeNode curRoot = queue.poll();
String str = br.readLine().trim();
int left = Integer.parseInt(str.substring(str.indexOf(':') + 1, str.indexOf('|')));
int right = Integer.parseInt(str.substring(str.indexOf('|') + 1));
if(left != -1){
curRoot.left = new TreeNode(left);
queue.offer(curRoot.left);
}
if(right != -1){
curRoot.right = new TreeNode(right);
queue.offer(curRoot.right);
}
}
System.out.println(isBST(tree));
}
private static int isBST(TreeNode root) {
inorder(root);
for(int i = 1; i < inorderSeq.size(); i++)
if(inorderSeq.get(i) <= inorderSeq.get(i - 1)) return 0;
return 1;
}
private static void inorder(TreeNode root) {
if(root == null) return;
isBST(root.left);
inorderSeq.add(root.val);
isBST(root.right);
}
} #include <bits/stdc++.h>
using namespace std;
int pre=-1,now=-1;
struct Tree{ int val,left,right;
};
void InOrder(Tree *T, int r)
{ if(r==-1) return; if(T[r].left != -1) InOrder(T, T[r].left); now = r; if(now>pre) pre = now; else{ cout<<0<<endl; return; } if(T[r].right!=-1) InOrder(T, T[r].right);
}
int main()
{ int r; while(cin>>r) { Tree T[100003]; int isBST = 1; queue<int> q; q.push(r); int t,left,right; char c; do{ cin>>t>>c>>left>>c>>right; T[t].val = t; T[t].left = left; T[t].right = right; q.pop(); if(left!=-1) { q.push(left); if(left>t) isBST = 0; } if(right!=-1) { q.push(right); if(right<t) isBST = 0; } }while(!q.empty()); if(isBST==0) cout<<isBST<<endl; else{ InOrder(T,r); } } return 0;
}
import java.util.LinkedList;
import java.util.Scanner;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
/**
* 如果BST是正确的,那么在进行中序遍历时,结点值应该是递增的
*
* @author wylu
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
TreeNode root = new TreeNode(scanner.nextInt());
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode curRoot = queue.poll();
String str = scanner.next();
int left = Integer.valueOf(str.substring(str.indexOf(':') + 1, str.indexOf('|')));
int right = Integer.valueOf(str.substring(str.indexOf('|') + 1));
if (left != -1) {
curRoot.left = new TreeNode(left);
queue.offer(curRoot.left);
}
if (right != -1) {
curRoot.right = new TreeNode(right);
queue.offer(curRoot.right);
}
}
int res = isBinarySearchTree(root, new int[1]) ? 1 : 0;
System.out.println(res);
}
private static boolean isBinarySearchTree(TreeNode root, int[] curMax) {
if (root == null) return true;
if (root.left == null) return true;
if (root.left.val > root.val || !isBinarySearchTree(root.left, curMax)) return false;
//如果左子树的最大值比当前根结点的值大
if (curMax[0] > root.val) return false;
if (root.right == null) return true;
if (root.right.val < root.val || !isBinarySearchTree(root.right, curMax)) return false;
//更新已遍历结点的最大值
curMax[0] = Math.max(curMax[0], root.right.val);
return true;
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
int root = 0;
scanf("%d", &root);
vector<vector<int>> tree(1024, {0,0});
int father, left, right;
while(scanf("%d:%d|%d", &father, &left, &right)!=EOF){
tree[father][0] = left;
tree[father][1] = right;
}
stack<int> stk;
int cur=root, pre=-1, res=1;
while(cur!=-1 || !stk.empty()){
while(cur!=-1){
stk.push(cur);
cur = tree[cur][0];
}
cur = stk.top(); stk.pop();
if(cur < pre){
res = 0;
break;
}else{
pre = cur;
}
cur = tree[cur][1]; // move to right
}
printf("%d\n", res);
return 0;
} package main
import (
"fmt"
"os"
"bufio"
"strings"
"strconv"
)
var in=bufio.NewReader(os.Stdin)
type Node struct{
val int
left *Node
right *Node
}
func main() {
var x int
fmt.Scan(&x)
root:=&Node{val:x}
cnt:=map[int]*Node{x:root}
var s string
for{
_,ok:=fmt.Fscan(in,&s)
if ok!=nil{
break
}
ss:=strings.Split(s,":")
lr:=strings.Split(ss[1],"|")
a,b,c:=atoi(ss[0]),atoi(lr[0]),atoi(lr[1])
var node,l,r *Node
if _,ok:=cnt[a];ok{
node=cnt[a]
}else{
node=&Node{val:a}
cnt[a]=node
}
if b!=-1{
if _,ok:=cnt[b];ok{
l=cnt[b]
}else{
l=&Node{val:b}
cnt[b]=l
}
}
if c!=-1{
if _,ok:=cnt[c];ok{
r=cnt[c]
}else{
r=&Node{val:c}
cnt[c]=r
}
}
node.left=l
node.right=r
}
arr:=order(root)
for i,x:=range arr{
if i>0&&arr[i-1]>x{
fmt.Print(0)
return
}
}
fmt.Print(1)
}
func atoi(s string)int{
x,_:=strconv.Atoi(s)
return x
}
func order(root *Node)[]int{
if root==nil{
return nil
}
ans:=[]int{}
ans=append(ans,order(root.left)...)
ans=append(ans,root.val)
ans=append(ans,order(root.right)...)
return ans
}
#include <iostream>
#include <vector>
#include <unordered_map>
#include <cstdio>
#include <climits>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode():val(0), left(nullptr), right(nullptr){}
TreeNode(int x):val(x), left(nullptr), right(nullptr){}
};
TreeNode* reconstruct(int x, unordered_map<int, pair<int, int>>& hash){
if(x == -1){
return nullptr;
}
TreeNode* root = new TreeNode(x);
root->left = reconstruct(hash[x].first, hash);
root->right = reconstruct(hash[x].second, hash);
return root;
}
bool isBST(TreeNode* root, int l, int r){
if(!root){
return true;
}
if(root->val<l || root->val>r){
return false;
}
return isBST(root->left, l, root->val) && isBST(root->right, root->val, r);
}
int main(){
// process input
int node, left, right;
unordered_map<int, pair<int, int>> hash;
cin >> node;
int root_val = node;
while(scanf("%d:%d|%d", &node, &left, &right)!=EOF){
hash[node] = {left, right};
}
// reconstruct binary tree
TreeNode* root = reconstruct(root_val, hash);
// BST
int res = isBST(root, INT_MIN, INT_MAX);
cout << res <<endl;
return 0;
} 二叉树重构能单独出道题了。。。
import java.util.*;
public class Main{
public static int pre = 0;
public static boolean con = true;
public static void inOrder(ArrayList<Integer> tree,int i,int len){
if(i<len&&tree.get(i)!=-1&&con){
inOrder(tree,2*i,len);
if(tree.get(i)<pre){
con = false;
};
pre = tree.get(i);
inOrder(tree,2*i+1,len);
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
ArrayList<Integer> tree = new ArrayList<>();
int count = 1;
in.nextLine();
while(in.hasNext()){
String line = in.nextLine();
if(count==1){
tree.add(Integer.parseInt(line.split(":")[0]));
count++;
}
String tmp = line.split(":")[1];
tree.add(Integer.parseInt(tmp.split("\\|")[0]));
tree.add(Integer.parseInt(tmp.split("\\|")[1]));
count+=2;
}
inOrder(tree,1,count);
System.out.println(con?1:0);
}
} import java.util.Scanner;
import java.util.LinkedList;
class TreeNode{
int val;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val){
this.val=val;
}
}
public class Main{
public static void mid(TreeNode root,LinkedList<Integer> seq){
if(root!=null){
mid(root.left,seq);
seq.add(root.val);
mid(root.right,seq);
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
LinkedList<TreeNode> queue=new LinkedList();
TreeNode root=new TreeNode(Integer.valueOf(sc.nextLine()));
queue.add(root);
while(queue.size()>0){
TreeNode cur=queue.removeFirst();
int[] nums=new int[3];
int cnt=0;
for(String str : sc.nextLine().split("[:\\|]")){
nums[cnt++]=Integer.valueOf(str);
}
if(nums[1]!=-1){//左子树
cur.left=new TreeNode(nums[1]);
queue.add(cur.left);
}
if(nums[2]!=-1){//右子树
cur.right=new TreeNode(nums[2]);
queue.add(cur.right);
}
}
LinkedList<Integer> seq=new LinkedList();
mid(root,seq);
int pre=-1;
boolean flag=false;
for(int num : seq){
if(num<pre){
break;
}
pre=num;
}
if(flag)
System.out.println(1);
else
System.out.println(0);
}
} import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
// 输入int,代表根节点,要注意跳过最后一个换行符
int n = sc.nextInt();
TreeNode root = new TreeNode(n);
sc.nextLine();
// 利用队列构造树
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
// 取出一个节点
TreeNode curRoot = queue.poll();
// 首先得到该节点的左右节点的值
String str = sc.nextLine();
int left = Integer.valueOf(str.substring(str.indexOf(':') + 1, str.indexOf('|')));
int right = Integer.valueOf(str.substring(str.indexOf('|') + 1));
if (left != -1) {
curRoot.left = new TreeNode(left);
queue.offer(curRoot.left);
}
if (right != -1) {
curRoot.right = new TreeNode(right);
queue.offer(curRoot.right);
}
}
// 判断该树是否为二叉搜索树
isTree(root);
int result = isBinarySearchTree() ? 1 : 0;
System.out.println(result);
}
// 创建一个List,保存其中序遍历
static List<Integer> list = new ArrayList<>();
private static void isTree(TreeNode root){
if(root == null) return;
isTree(root.left);
list.add(root.val);
isTree(root.right);
}
// 判断该List是不是递增
private static boolean isBinarySearchTree() {
for (int i = 0; i < list.size()-1; i++){
if (list.get(i) > list.get(i+1)){
return false;
}
}
return true;
}
}
import sys def preorder(res,root,new): if root!="-1": preorder(res,res[root][0],new) new.append(root) preorder(res,res[root][1],new) root=input() res={} while(True): line=sys.stdin.readline().strip() if line=="": break key,value=line.split(":") res[key]=value.split("|") new=[] #print(res) preorder(res,root,new) flag=1 for i in range(1,len(new)): if new[i]<new[i-1]: flag=0 if flag==1: print(1) else: print(0)