二叉树的递归套路——搜索二叉树

简介: 二叉树的递归套路——搜索二叉树

给定一棵二叉树的头节点head,返回这颗二叉树是不是搜索二叉树

搜索二叉树定义:左树所有结点比头结点小,右树所有结点比头结点大,每颗子树都如此。

根据二叉树的递归套路,直接得出每颗子树需要返回的信息就是:

   整颗子树是否是搜索二叉树

   整颗子树的最大值

   整颗子树的最小值

比较简单,如果有不了解可以看看这篇文章——二叉树的递归套路——最大二叉搜索子树大小

接下来直接看代码叭:

package com.harrison.class08;
import java.util.ArrayList;
public class Code06_IsBST {
  public static class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int data) {
      this.value = data;
    }
  }
  public static class Info{
    public boolean isBST;
    public int max;
    public int min;
    public Info(boolean is,int ma,int mi) {
      isBST=is;
      max=ma;
      min=mi;
    }
  }
  public static Info process1(Node head) {
    if(head==null) {
      return null;
    }
    Info leftInfo=process1(head.left);
    Info rightInfo=process1(head.right);
    int max=head.value;
    int min=head.value;
    if(leftInfo!=null) {
      max=Math.max(max, leftInfo.max);
      min=Math.min(min, leftInfo.min);
    }
    if(rightInfo!=null) {
      max=Math.max(max, rightInfo.max);
      min=Math.min(min, rightInfo.min);
    }
    boolean isBST=false;
    if(
      (leftInfo==null?true:leftInfo.isBST)
      &&
      (rightInfo==null?true:rightInfo.isBST)
      &&
      (leftInfo==null?true:leftInfo.max<head.value)
      &&
      (rightInfo==null?true:rightInfo.min>head.value)
      ) {
      isBST=true;
    }
    return new Info(isBST, max, min);
  }
  public static boolean isBST1(Node head) {
    if(head==null) {
      return true;
    }
    return process1(head).isBST;
  }
  public static void in(Node head, ArrayList<Node> arr) {
    if (head == null) {
      return;
    }
    in(head.left, arr);
    arr.add(head);
    in(head.right, arr);
  }
  public static boolean isBST2(Node head) {
    if (head == null) {
      return true;
    }
    ArrayList<Node> arr = new ArrayList<>();
    in(head, arr);
    for (int i = 1; i < arr.size(); i++) {
      if (arr.get(i).value <= arr.get(i - 1).value) {
        return false;
      }
    }
    return true;
  }
  public static Node generateRandomBST(int maxLevel,int maxValue) {
    return generate(1, maxLevel, maxValue);
  }
  public static Node generate(int level,int maxLevel,int maxValue) {
    if(level>maxLevel || Math.random()<0.5) {
      return null;
    }
    Node head=new Node((int)(Math.random()*maxValue));
    head.left=generate(level+1, maxLevel, maxValue);
    head.right=generate(level+1, maxLevel, maxValue);
    return head;
  }
  public static void main(String[] args) {
    int maxLevel = 4;
    int maxValue = 100;
    int testTimes = 1000000;
    for (int i = 0; i < testTimes; i++) {
      Node head = generateRandomBST(maxLevel, maxValue);
      if (isBST1(head) != isBST2(head)) {
        System.out.println("Oops!");
      }
    }
    System.out.println("finish!");
  }
}
相关文章
|
6月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
39 0
|
算法
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
48 0
|
7月前
搜索二叉树(二叉搜索树)的实现(递归与非递归)
搜索二叉树(二叉搜索树)的实现(递归与非递归)
|
7月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
98 0
|
存储
二叉树相关问题细谈递归(上)
二叉树相关问题细谈递归
70 0
二叉树相关问题细谈递归(下)
二叉树相关问题细谈递归(下)
63 0
|
存储 算法 关系型数据库
重温算法之二叉树的锯齿形层序遍历
关于二叉树的题目其实是我的弱项,虽然二叉树不是很难理解,但是从学校开始接触二叉树开始就对它不是很感冒,所以很多时候都避开它,但是再难咬的骨头也的得啃,二叉树运用在很多程序的底层实现里,比如MySQL的索引实现就是B+树,我们懂得使用索引的同时也得知道,索引为什么这么快,而其快的原因就是底层里B+树得实现。
111 0
重温算法之二叉树的锯齿形层序遍历
【LeetCode剑指offer26】树的子结构(递归)
题目判断的是B是否为A树的【子结构】,而不判断是【子树】。 直观的思路: 从A的每个节点开始逐个(递
133 0
【LeetCode剑指offer26】树的子结构(递归)
【LeetCode剑指offer】二叉搜索树的最近公共祖先(迭代or递归)
求两个节点的最近公共祖先的题目我们做过,但是这题是二叉搜索树BST,并且本题中所有节点的数值都是不同的,所以可以根据BST的数值特点进行判断,即左子树的所有节点都比当前节点小,右子树的所有节点都比当前节点数值大。
116 0
【LeetCode剑指offer】二叉搜索树的最近公共祖先(迭代or递归)