5.5日签到题。难度中等题。(感觉算不上中等题的难度)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
我的思路:我想到的有两种解法:
1.形式上简单,时间空间复杂度较高。用递归直接中序遍历得到该二叉树的排序,如果符合条件,那么这个序列就是严格的递增序列,否则不符合。非递归遍历道理一样,只是运行时间较短。
2.直接把根节点放入一个linklist,判断当前节点和其子节点的大小关系。情况有以下几种:
a. 左孩子的左孩子(若存在) < 左孩子
b.左孩子的的右孩子 > 左孩子 && 左孩子的右孩子 < 该节点 (若左的右不存在,则改为左和该比较)
c. 右孩子的左孩子 > 该节点 && 右孩子的左孩子 < 右孩子(若右的左不存在,则改为右和该比较)
d.右孩子的右孩子(若存在) > 右孩子
这几个判断我认为是比较麻烦的,所以我选择的是第一种方法。
代码如下:
LinkedList<Integer> intList = new LinkedList<Integer>();
public void middle(TreeNode root){
if(root == null)
return;
middle(root.left);
intList.add(root.val);
middle(root.right);
}
public boolean isValidBST(TreeNode root) {
LinkedList<TreeNode> nodeList = new LinkedList<TreeNode>();
if (root == null)
return true;
middle(root);
int lengthList = intList.size()-1;
for (int i = 0; i < lengthList; ++i){
if(intList.get(i) >= intList.get(i+1))
return false;
}
return true;
}