有一半的代码都在处理输入格式:
import java.util.*;
class TreeNode{ //定义树节点
int val;
TreeNode left, right;
TreeNode(int n){val = n;}
}
public class Main {
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
Map<Integer, TreeNode> m = new HashMap<>(); //用节点值映射树节点
m.put(-1, null);
int r = Integer.parseInt(sc.nextLine()); //根节点
m.put(r, new TreeNode(r));
while(sc.hasNextLine()){
String[] v1 = sc.nextLine().split(":"); //处理这奇葩的输入
String[] v2 = v1[1].split("[|]");
int lf = Integer.parseInt(v2[0]), rt = Integer.parseInt(v2[1]);
if(lf != -1) m.put(lf, new TreeNode(lf));
if(rt != -1) m.put(rt, new TreeNode(rt));
m.get(Integer.parseInt(v1[0])).left = m.get(lf);
m.get(Integer.parseInt(v1[0])).right = m.get(rt);
}
if(h(m.get(r))) System.out.println(1);
else System.out.println(0);
}
static int f(TreeNode r){ //求一棵树的最大节点值
if(r == null) return Integer.MIN_VALUE;
return Math.max(Math.max(f(r.left), f(r.right)), r.val);
}
static int g(TreeNode r){ //求一棵树的最小节点值
if(r == null) return Integer.MAX_VALUE;
return Math.min(Math.min(g(r.left), g(r.right)), r.val);
}
static boolean h(TreeNode r){ //判断BST
if(r == null) return true;
return r.val > f(r.left) && r.val < g(r.right) && h(r.left) && h(r.right);
}
}
京公网安备 11010502036488号