给定一棵满二叉树,判定该树是否为二叉搜索树,是的话打印True,不是的话打印False
条件说明
a. 二叉搜索树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 b. 满二叉树,除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树 c. 树内节点数不超过 10000,非空节点值为大于0小于65536的整数,空树或空节点输入为None
输入描述:
从根节点开始,逐层输入每个节点的值,空树或空节点输入为None
比如:10,5,15,3,7,13,18
输出描述:
是二叉搜索树的话打印True,不是的话打印False
最初的想法
将输入的数据(即源数据)按从小到大排序,中位数一定是根节点,因为是满二叉树,所以中位数左边的数目一定等于中位数的右边数目,如果不等则不是满二叉树,采用递归解决。
存在问题
存在空树以及空节点(None节点)无法进行排序选择
最后解决方案
直接上代码
java代码片
.
// An highlighted block
import java.util.*;
public class Main{
//内部类要声明为static
static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
TreeNode(int val) {
this.val = val;
}
}
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
ArrayList<TreeNode> list = new ArrayList<>();
String str = scan.nextLine();
String[] strArray = str.split(",");
//如果之后一个节点,且节点是None,返回true
if(strArray.length==1&&str.equals("None")){
System.out.print("True");
}else if(strArray[0].equals("None")){//如果节点不止元素,并且root元素是None,
System.out.print("False");//返回false
}else{
boolean istrue = true;
for(int i=0;i<strArray.length;i++){
//如果中间节点是None,指定为null;然后构建满二叉树;
if(strArray[i].equals("None")){
list.add(null);
}else {
//如果不是空,就直接加入
TreeNode node = new TreeNode(Integer.parseInt(strArray[i]));
list.add(node);
}
}
for(int i=0;i<=list.size()/2-1;i++){
if(2 * i + 1<list.size()){
list.get(i).left = list.get(2 * i + 1);
}else{
istrue = false;
break;
}
if(2 * i + 2<list.size()){
list.get(i).right = list.get(2 * i + 2);
}else{
istrue = false;
break;
}
}
TreeNode root = list.get(0);
//todo
ArrayList<Integer> list1 = new ArrayList<>();
midd(root,list1);
for(int i=0;i<list1.size()-1;i++){
if(list1.get(i)>=list1.get(i+1))
istrue = false;
}
if(istrue)
System.out.print("True");
else
System.out.print("False");
}
}
public static void midd(TreeNode root,ArrayList<Integer> list){
if(root.left !=null)
midd(root.left,list);
list.add(root.val);
if(root.right!=null)
midd(root.right,list);
}
}