Java树表查找知识点(含面试大厂题和源码)

树表查找(Tree-based Search),又称为树形查找,是一种利用树形数据结构进行查找的方法。在计算机科学中,常见的树形查找结构包括二叉搜索树(BST)、平衡二叉树(如AVL树)、B树、B+树、红黑树等。这些数据结构可以有效地支持数据的存储、查找、插入和删除操作。

树表查找的基本原理:

  1. 二叉搜索树(BST):在BST中,对于任意节点左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。查找时从根节点开始,根据目标值与当前节点值的大小关系,向左或向右递归地进行搜索。

  2. 平衡二叉树:平衡二叉树如AVL树,是特殊的BST,它在BST的基础上增加了平衡条件,确保树的高度保持对数级别,从而提高查找效率。

  3. B树和B+树:这两种树结构广泛应用于数据库和文件系统中,它们允许每个节点有多个子节点(超过两个),从而减少树的高度,提高磁盘I/O效率。

  4. 红黑树:红黑树是一种自平衡的二叉搜索树,它通过一系列的旋转和重新着色操作来保持树的平衡,常用于实现关联数组等数据结构。

树表查找的应用场景:

  • 数据库索引:B树和B+树被广泛用于数据库系统中,作为索引结构来加快数据查询速度。
  • 文件系统:文件系统中的目录结构通常采用树形结构,以便于文件的管理和快速查找。
  • 数据压缩:如Huffman编码树,通过构建字符的频率 Huffman 树来进行数据压缩。

二叉搜索树查找的Java实现:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class BinarySearchTreeSearch {
    public TreeNode root;

    public BinarySearchTreeSearch() {
        root = null;
    }

    public void insert(int val) {
        root = insertIntoBST(root, val);
    }

    private TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (val < root.val) {
            root.left = insertIntoBST(root.left, val);
        } else if (val > root.val) {
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }

    public boolean search(int val) {
        return searchBST(root, val);
    }

    private boolean searchBST(TreeNode root, int val) {
        if (root == null) {
            return false;
        }
        if (val == root.val) {
            return true;
        }
        return val < root.val ? searchBST(root.left, val) : searchBST(root.right, val);
    }

    public static void main(String[] args) {
        BinarySearchTreeSearch tree = new BinarySearchTreeSearch();
        tree.insert(5);
        tree.insert(3);
        tree.insert(8);
        tree.insert(1);
        tree.insert(4);
        boolean found = tree.search(4);
        System.out.println("Value 4 found: " + found);
    }
}

在面试中,了解树表查找的原理和实现是非常重要的,尤其是当面试官询问关于数据结构和算法的问题时。通过实现树表查找,可以展示你对基本数据结构和算法的掌握程度。希望这些知识点和示例代码能够帮助你更好地准备面试!树表查找是大厂面试中常见的题目类型,尤其是在处理大量数据和需要高效查找的场景中。以下是三道可能出现在大厂面试中的与树表查找相关的编程题目,以及相应的Java源码实现。

题目 1:二叉搜索树中的插入操作

描述
给定一个二叉搜索树(BST),向其中插入一个新的值,并保持BST的性质。

示例

输入: 根节点为 4,插入 2 和 6
输出: BST 变为
      4
     / \
    2   6

Java 源码

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class InsertIntoBST {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (val < root.val) {
            root.left = insertIntoBST(root.left, val);
        } else {
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }

    public static void main(String[] args) {
        InsertIntoBST solution = new InsertIntoBST();
        TreeNode root = new TreeNode(4);
        root = solution.insertIntoBST(root, 2);
        root = solution.insertIntoBST(root, 6);
        // 打印BST结构,验证插入结果
    }
}

题目 2:找到二叉搜索树中的最大值

描述
给定一个二叉搜索树(BST),找到并返回树中的最大值。

示例

输入: BST 为
      4
     / \
    2   6
输出: 6

Java 源码

public class FindMaxInBST {
    public int findMax(TreeNode root) {
        if (root == null) {
            return Integer.MIN_VALUE;
        }
        while (root.right != null) {
            root = root.right;
        }
        return root.val;
    }

    public static void main(String[] args) {
        FindMaxInBST solution = new FindMaxInBST();
        TreeNode root = new TreeNode(4);
        root.left = new TreeNode(2);
        root.right = new TreeNode(6);
        int max = solution.findMax(root);
        System.out.println("Maximum value in BST: " + max);
    }
}

题目 题目 3:验证二叉搜索树

描述
给定一个节点,判断一个二叉树是否为二叉搜索树。假设所有节点的值都是唯一的。

示例

输入: BST 为
      5
     / \
    1   4
   / \
  3   6
输出: true

Java 源码

public class ValidateBST {
    public boolean isValidBST(TreeNode root) {
        return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    private boolean validate(TreeNode node, long min, long max) {
        if (node == null) {
            return true;
        }
        if (node.val <= min || node.val >= max) {
            return false;
        }
        return validate(node.left, min, node.val) && validate(node.right, node.val, max);
    }

    public static void main(String[] args) {
        ValidateBST solution = new ValidateBST();
        TreeNode root = new TreeNode(5);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.left.left = new TreeNode(3);
        root.left.right = new TreeNode(6);
        boolean isValid = solution.isValidBST(root);
        System.out.println("Is the tree a valid BST? " + isValid);
    }
}

这些题目和源码展示了树表查找在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * 根据等级查询类目 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值