链表和二叉搜索树之间的主要区别是什么?BST是否只是维护链表的一种方式?我的讲师讲解了链表和BST,但没有进行比较或说明何时应该优先选择其中之一。这可能是一个愚蠢的问题,但我真的很困惑。如果有人能简单地澄清这一点,我将不胜感激。
链表和二叉搜索树之间的主要区别是什么?BST是否只是维护链表的一种方式?我的讲师讲解了链表和BST,但没有进行比较或说明何时应该优先选择其中之一。这可能是一个愚蠢的问题,但我真的很困惑。如果有人能简单地澄清这一点,我将不胜感激。
链表:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
二叉树:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
在链表中,所有项都通过一个单一的next指针链接在一起。
在二叉树中,每个节点可以有0、1或2个子节点,其中(在二叉搜索树的情况下)左节点的键小于节点的键,右节点的键大于节点。只要树是平衡的,每个项的搜索路径比链表中的路径要短得多。------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
通过使用更大的数据结构,平均搜索路径变得更短:
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
二叉搜索树是一种二叉树,其中每个内部节点x都存储一个元素,使得存储在x左子树中的元素小于或等于x,存储在x右子树中的元素大于或等于x。
链表由一系列节点组成,每个节点包含任意值和一个或两个指向下一个和/或前一个节点的引用。
我认为主要的区别在于二叉搜索树是有序的。当您插入二叉搜索树时,元素存储在内存中的位置取决于它们的值。而链表则不管元素的值是什么,都会将其盲目添加到列表中。
显然,这里存在一些权衡: 链表保留插入顺序,并且插入操作更加便宜; 二叉搜索树通常比较快速地进行搜索。
链表是一系列相互链接的“节点”,即:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
二叉搜索树使用类似的节点结构,但是它不是链接到下一个节点,而是链接到两个子节点:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
5
/ \
3 9
/ \ \
1 2 12
9没有左子节点,1、2和12是“叶子”——它们没有分支。
明白吗?
对于大多数“查找”类的用途,二叉搜索树更好。但对于只是“保留一些东西以便稍后处理先进先出或后进先出”的事情,链表可能很好地发挥作用。