我想知道二叉树的具体应用是什么。你能举几个例子吗?


当前回答

BST是一种二叉树,在Unix内核中用于管理一组虚拟内存区域(vma)。

其他回答

争论二叉树的性能是没有意义的——它们不是一种数据结构,而是一组数据结构,它们都具有不同的性能特征。虽然不平衡二叉树的搜索性能确实比自平衡二叉树差得多,但对于许多二叉树(如二进制尝试)来说,“平衡”是没有意义的。

二叉树的应用

Binary Search Tree - Used in many search applications where data is constantly entering/leaving, such as the map and set objects in many languages' libraries. Binary Space Partition - Used in almost every 3D video game to determine what objects need to be rendered. Binary Tries - Used in almost every high-bandwidth router for storing router-tables. Hash Trees - Used in torrents and specialized image-signatures in which a hash needs to be verified, but the whole file is not available. Also used in blockchains for eg. Bitcoin. Heaps - Used in implementing efficient priority-queues, which in turn are used for scheduling processes in many operating systems, Quality-of-Service in routers, and A* (path-finding algorithm used in AI applications, including robotics and video games). Also used in heap-sort. Huffman Coding Tree (Chip Uni) - Used in compression algorithms, such as those used by the .jpeg and .mp3 file-formats. GGM Trees - Used in cryptographic applications to generate a tree of pseudo-random numbers. Syntax Tree - Constructed by compilers and (implicitly) calculators to parse expressions. Treap - Randomized data structure used in wireless networking and memory allocation. T-tree - Though most databases use some form of B-tree to store data on the drive, databases which keep all (most) their data in memory often use T-trees to do so.


二叉树比n-ary树更常用于搜索的原因是n-ary树更复杂,但通常不会提供真正的速度优势。

在一个有m节点的(平衡的)二叉树中,从一层移动到下一层需要进行一次比较,并且有log_2(m)层,总共有log_2(m)次比较。

相比之下,一个n元树将需要log_2(n)个比较(使用二叉搜索)来移动到下一层。由于总共有log_n(m)个级别,因此搜索将需要log_2(n)*log_n(m) = log_2(m)个比较。因此,尽管n元树更复杂,但就必要的总体比较而言,它们没有提供任何优势。

(然而,n-ary树在生态位环境中仍然有用。首先想到的例子是四叉树和其他空间划分树,其中每层只使用两个节点划分空间会使逻辑不必要地复杂;以及在许多数据库中使用的b -树,其中限制因素不是在每个级别上进行多少比较,而是一次可以从硬盘加载多少节点)

关于二叉树,还有一个有趣的例子没有提到,那就是递归求值的数学表达式。从实际的角度来看,它基本上是无用的,但它是一种有趣的方式来考虑这样的表达式。

基本上,树的每个节点都有一个值,这个值要么是自身固有的,要么是通过对其子节点的值进行操作来递归计算的。

例如,表达式(1+3)*2可以表示为:

    *
   / \
  +   2
 / \
1   3

为了求表达式的值,我们要求父元素的值。这个节点又从它的子节点,一个加号运算符和一个只包含“2”的节点中获取它的值。加号运算符依次从值为“1”和“3”的子运算符中获取其值,并将它们相加,将4返回给返回8的乘法节点。

这种二叉树的使用在某种意义上类似于反向抛光表示法,因为执行操作的顺序是相同的。还有一点需要注意的是,它不一定是二叉树,只是最常用的操作符是二叉的。在最基本的层次上,这里的二叉树实际上只是一种非常简单的纯函数式编程语言。

几乎所有的数据库(和类数据库)程序都使用二叉树来实现它们的索引系统。

二叉树的应用:

实现路由器中的路由表。 数据压缩码 表达式解析器和表达式求解器的实现 解决数据库问题,如索引。 表达式求值

最常见的应用之一是高效地以排序形式存储数据,以便快速访问和搜索存储的元素。例如,std::map或std::set在c++标准库中。

二叉树作为一种数据结构,对于表达式解析器和表达式求解器的各种实现非常有用。

它也可以用来解决一些数据库问题,例如,索引。

一般来说,二叉树是一种特定的基于树的数据结构的一般概念,各种特定类型的二叉树可以构造成具有不同性质的二叉树。