总结二叉搜索树

Posted huixinxinw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结二叉搜索树相关的知识,希望对你有一定的参考价值。

简单介绍

二叉搜索树又叫二叉查找树。

是一种数据结构,支持多种动态集合操作,包括查找,返回最小值,返回最大值,返回前驱和后继节点,插入和删除

它既可以用作字典,也可以用做优先队列。

如果一颗二叉树满足这样的特性:

设 x为二叉查找树中的一个节点。

1.如果 y是x 的左子树的一个节点,则 key[y] <= key[x].

2.如果 y是x 的右子树的一个节点,则 key[x] <= key[y].

那么则称它为二叉查找树

二叉查找树是学习平衡树的基础

基本操作

1.查询

如果在数组中我们想寻找一个元素k,时间复杂度为O(n)

二叉搜索树中查询的话,如果k的值大于当前节点,就去搜索当前节点的右子树,如果k的值小于当前节点,就去搜索当前节点的左子树

这样时间复杂度就为O(树的高度)

Tree-Search(x, k)
    if x == NULL or k == key[x]:
    return x
    if k < key[x]:
    return Tree-Search(left[x], k)
    else
    return Tree-Search(right[x], k)

2.遍历

我们可以对一个二叉搜索树进行中序遍历

inorder(x):
    if x != NULL:
    inorder(left[x])
    print key[x]
    inorder(right[x])

调用这个函数我们就可以输出一个二叉搜索树种的所有元素

3.插入

同样搜索,直到遇到一个节点,

如果我要插入的元素大于节点的值并且当前节点没有右儿子,就将插入的元素放到当前节点的右儿子上。

或者我要插入的元素小于当前节点的值并且当前节点没有左儿子,就将插入的元素放到当前节点的左儿子上。

Tree-Insert(T, z):
    y = NULL, x = root[T]
    while x != NULL:
        y = x
        if (key[z] < key[x]) x = left[x]; 
        else x = right[x]
    parent[z] = y
    if y == NULL then root[T] = z
    else if key[z] < key[y] then left[y] = z
    else right[y] = z

如果要删除元素,则需要分四种情况讨论,比较复杂

4.查询最大最小元素

最小元素:从根节点开始,沿着各节点的 left 指针查找下去

Tree-Minimum(x):
    while left[x] != NULL:
        x = left[x]
    return x

最大元素:从根节点开始,沿着各节点的right指针查找

Tree-Maximum(x):
    while right[x] != NULL:
        x = right[x]
    return x

随机构造的二叉查找树

我们已经知道,二叉查找树上的各基本操作的运行时间都是O(h),h 为树的高度。

但是随着元素的插入或删除,树的高度会发生变化。

例如,如果各元素按严格增长的顺序插入,那么构造出的树就是一个高度为 n - 1 的链

如果各元素按照随机的顺序插入,则构造出的二叉查找树的期望高度为 O(log n)

以上是关于总结二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

总结所有有关二叉树公共祖先问题

二叉搜索树的平均查找长度及时间复杂度

leetcode二叉树简单题技巧总结

leetcode二叉树简单题技巧总结

学习数据结构笔记(12) --- [平衡二叉搜索树(AVLTREE)]