算法思想之三叉搜索树

三叉搜索树

  • 三叉搜索树(Ternary Search Tree)是一种特殊的搜索树数据结构。它与二叉搜索树相似,但每个节点具有三个子节点:左子节点、中子节点和右子节点。通常,左子节点存储小于节点值的元素,右子节点存储大于节点值的元素,而中子节点存储等于节点值的元素。
  • 三叉搜索树适用于需要高效存储和查找字符串集合的问题,尤其是对于动态字典或自动完成等应用程序。以下是适用于三叉搜索树的一些常见问题类型:
    • 前缀匹配:可以使用三叉搜索树快速找到具有给定前缀的所有字符串。通过从根节点开始,选择左子节点、中子节点或右子节点来遍历树,就可以找到匹配的字符串。
    • 自动完成:三叉搜索树可以用于实现自动完成功能,根据用户输入的前缀,快速提供可能的补全选项。
    • 单词查找:可以将单词存储在三叉搜索树中,并快速检索是否存在某个单词。
    • 模式匹配:三叉搜索树可以用于搜索包含通配符的模式,并找到与模式匹配的所有字符串。
  • 需要注意的是,虽然三叉搜索树在某些情况下可以提供高效的查询性能,但在某些特定情况下,它可能会导致树的不平衡,并影响性能。因此,在使用三叉搜索树时需要谨慎权衡其优势和局限性。

三叉搜索树的高度 - 三叉树DFS - 较低

  • 题目描述

    定义构造三叉搜索树规则如下:

    每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:

    • 如果数小于节点的数减去500,则将数插入节点的左子树
    • 如果数大于节点的数加上500,则将数插入节点的右子树
    • 否则,将数插入节点的中子树

    给你一系列数,请按以上规则,按顺序将数插入树中,构建出一棵三叉搜索树,最后输出树的高度。

    输入要求

    第一行为一个数 N,表示有 N 个数,1 ≤ N ≤ 10000

    第二行为 N 个空格分隔的整数,每个数的范围为[1,10000]

    输出要求

    输出树的高度(根节点的高度为1)

  • 用例1

    输入:
    5
    5000 2000 5000 8000 1800
    输出:3
    说明:最终构造出的树如下,高度为3。
    

    算法思想之三叉搜索树_第1张图片

    用例2

    输入:
    3
    5000 4000 3000
    输出:3
    说明:最终构造出的树如下,高度为3。
    

    算法思想之三叉搜索树_第2张图片

    用例3

    输入:
    9
    5000 2000 5000 8000 1800 7500 4500 1400 8100
    输出:4
    说明:最终构造出的树如下,高度为4。
    

    算法思想之三叉搜索树_第3张图片

  • 题解

    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while (sc.hasNext()) {
                int n = sc.nextInt();
                Tree tree = new Tree();
                for (int i = 0; i < n; i++) 
                    tree.addNode(sc.nextInt());
                System.out.println(tree.height);
            }
        }
        public static class Node {
            public int value;
            public int height;
            public Node left;
            public Node mid;
            public Node right;
            public Node(int value) {
                this.value = value;
            }
        }
        public static class Tree {
            public Node root;
            public int height;
            public void addNode(int value) {
                Node node = new Node(value);
                if (root == null) {
                    node.height = 1;
                    root = node;
                    height = 1;
                } else {
                    Node current = root;
                    while (true) {
                        node.height = current.height + 1;
                        this.height = Math.max(this.height, node.height);
                        if (value < current.value - 500) {
                            if (current.left == null) {
                                current.left = node;
                                break; // 停止搜索
                            } else current = current.left;
                        } else if (value > current.value + 500) {
                            if (current.right == null) {
                                current.right = node;
                                break;
                            } else current = current.right;
                        } else {
                            if (current.mid == null) {
                                current.mid = node;
                                break;
                            } else current = current.mid;
                        }
                    }
                }
            }
        }
    }
    

你可能感兴趣的:(算法,算法,深度优先)