码迷,mamicode.com
首页 > 其他好文 > 详细

【总结】二叉搜索树

时间:2020-01-18 14:25:11      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:return   数据结构   运行时   print   后继节点   基本   高度   二叉搜索树   集合   

简单介绍

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

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

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

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

设 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)

【总结】二叉搜索树

标签:return   数据结构   运行时   print   后继节点   基本   高度   二叉搜索树   集合   

原文地址:https://www.cnblogs.com/huixinxinw/p/12208908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!