第九关|中序与搜索树

1、二叉搜索树中搜索特定值

leetcode700

1、递归法

  1. 遍历到最后没找到该值,(即root == null),那就返回null(root此时即可)
  2. 找到值了(root.val == val),返回该节点(root)
  3. 待找值<当前节点值(val < root.val),递归左子树
  4. 与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、验证二叉搜索树

leetcode98

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)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值