1、二叉搜索树中搜索特定值
1、递归法
- 遍历到最后没找到该值,(即root == null),那就返回null(root此时即可)
- 找到值了(root.val == val),返回该节点(root)
- 待找值<当前节点值(val < root.val),递归左子树
- 与3相反
public static TreeNode searchBST(TreeNode root, int val){
if(root == null || root.val == val) return root;
return val < root.val ? searchBST(root.left, val) : searchBST(root.right, val);
}
时间复杂度:o(N) ,空间复杂度:o(N)
2、迭代法
节点不为空时值不相等,就一直循环遍历,根据对比完值,把节点缩小到它的左/右子树,直到找到该值节点或者没找到节点为空,就返回该节点。
public static TreeNode searchBST(TreeNode root, int val){
while(root != null && root.val != val){ //这里是&&不是||
root = val < root.val ? root.left : root.right;
}
return root;
}
时间复杂度:o(N) ,空间复杂度:o(1)
2、验证二叉搜索树
1、递归法
由题性质,该树中序遍历后的结果是升序的,在遍历时只需不断对比当前值和前一个值即可。
时间复杂度:o(N),o(N)
2、迭代法
中序遍历的迭代法中加个变量判断
public static boolean isValidBST2(TreeNode root){
if(root == null) return true;
Deque<TreeNode> stack = new LinkedList<>();
TreeNode pre = null;
while(!stack.isEmpty() || root != null){
while(root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
//第二个节点开始要开始与前一个节点对比值了
if(pre != null && root.val <= pre.val){
return false;
}
pre = root;
root = root.right;
}
return true;
}
时间复杂度:o(N),o(N)