二叉树专题: 判断是不是搜索二叉树-java实现

判断二叉树是不是搜索二叉树

什么是搜索二叉树

搜索二叉树(Binary Search Tree,简称 BST)是一种二叉树,其中左子树中的所有节点的值都小于根节点的值,右子树中的所有节点的值都大于根节点的值。这种树的查找、插入和删除操作的时间复杂度都是 O(log n)。

解题思路

用递归的方式去做,在递归的过程中,我们可以判断左树是不是搜索二叉树,右树是不是搜索二叉树,然后合成一颗树时,判断整体是不是搜索二叉树。
1.构建每次递归要得到的信息,是不是平衡二叉树,和左树最大值,右树最小值,因为合成一颗树时,要判断左树最大值小于根节点的值,右树最小值大于根节点的值
2.创建消息体,每次递归组装这些消息,然后就可以判断是不是搜索二叉树了

递归解题

先定义一个二叉树的结构

  public class Node{
        int val;
        Node left;
        Node right;

        public Node(int val) {
            this.val = val;
        }
    }	

递归写法

		/**
		定义每次要拿到的信息体。
		*/
    public static class Info{
        boolean isBST;
        int max;
        int min;

        public Info(boolean isBST, int max, int min) {
            this.isBST = isBST;
            this.max = max;
            this.min = min;
        }
    }
/**
* 递归调用
*/
public static Info process(Node head){
			//base case 为null 时,因为无法给消息体最大最小值赋值,所以给个null 就可以
        if (head == null){
            return null;
        }
        Info left = process(head.left);
        Info right = process(head.right);
        int max = head.val;
        int min = head.val;

        if (left != null){
            max = Math.max(max,left.max);
        }
        if (right != null){
            min = Math.min(min,right.min);
        }
        boolean isBst = true;
        //把不满足的条件都列出来
        if (left != null && !left.isBST){
           isBst = false;
        }
        if (right != null && !right.isBST){
            isBst = true;
        }
        if (left != null && left.max > max){
            isBst = false;
        }
        if (right != null && right.min < min){
            isBst = false;
        }
        return new Info(isBst,max,min);

    }
 /**
     * 主方法
     * @param head
     * @return
     */
    public static boolean isBST(Node head ){
        //为null默认是搜索二叉树,
        if (head == null){
            return true;
        }
        Info info = process(head);
        return info.isBST;
    }

非递归解法

 /**
     * 非递归实现
     * @param head
     * @return
     */
    public static boolean isBst(Node head){
        if (head == null){
            return true;
        }
        ArrayList<Node> nodes = new ArrayList<>();
        in(head,nodes);
        for (int i = 1; i < nodes.size();i++){
           if (nodes.get(i).val <= nodes.get(i-1).val){
              return false;
           }
        }
        return true;
    }

    /**
     * 中序遍历 添加到集合中
     * @param node
     * @param nodes
     */
    public static void in(Node node,ArrayList<Node> nodes){
        if (node == null){
            return ;
        }
        in(node.left,nodes);
        nodes.add(node);
        in(node.right,nodes);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值