难度(medium)
题目描述:
判断给出的二叉树是否是一个二叉搜索树(BST),二叉搜索树的定义如下
一个节点的左子树上节点的值都小于自身的节点值
一个节点的右子树上节点的值都大于自身的节点值
所有节点的左右子树都必须是二叉搜索树
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。
1 / \ 2 3 / 4 \ 5
上述的二叉树序列化的结果是:"{1,2,3,#,#,4,#,#,5}".
1 / \ 2 3 / \ / \# # 4 # / \ # 5
思路:
根据二叉搜索树的中序遍历特点,遍历后数值是升序,然后对数值用一个数组进行存储,最后在集合中相邻两个数值进行判断,看是否符合升序特点,符合就是,不符合就不是。
代码:
import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { public boolean isValidBST (TreeNode root) { //先设置一个集合存储中序遍历后的二叉搜索树值 Listlist = new ArrayList<>(); //中序遍历 inOrder(root,list); //对集合的相邻元素进行判断 //按照中序遍历二叉搜索树后的排列特点 //如果前一个值大于后一个值,就是错误的 for(int i = 1; i < list.size(); i++){ if(list.get(i-1).val >= list.get(i).val){ return false; } } return true; } public static void inOrder(TreeNode root, Listlist){ //中序遍历树,并且边遍历边存储 if(root != null){ inOrder(root.left,list); list.add(root); inOrder(root.right,list); } }}
封面来自网络,侵删