给定一棵满二叉树,判定该树是否为二叉搜索树

给定一棵满二叉树,判定该树是否为二叉搜索树,是的话打印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);
       }
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值