从零开始: 二叉查找

1、二叉树

二叉树(Binary Tree)的特点是每个结点至多具有两棵子树(即在二叉树中不存在度大于2的结点),并且子树之间有左右之分。

二叉树的性质:

(1)、在二叉树的第i层上至多有2i-1个结点(i≥1)。

(2)、深度为k的二叉树至多有2k-1个结点(k≥1)。

(3)、对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

一棵深度为k且有2k-1个结点的二叉树称为满二叉树。

可以对满二叉树的结点进行连续编号,约定编号从根结点起,自上而下,自左至右,则由此可引出完全二叉树的定义。深度为k且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称之为完全二叉树。

(4)、具有n个结点的完全二叉树的深度为不大于log2n的最大整数加1。

(5)、如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到最后一层,每层从左到右),则对任一结点i(1≤i≤n),有

a、如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点x(其中x是不大于i/2的最大整数)。

b、如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。

c、如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。

二叉树的链式存储:

链式二叉树中的每个结点至少需要包含三个域,数据域和左、右指针域。

二叉树的遍历:

假如以L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则可有DLR、DRL、LRD、LDR、RLD、RDL这六种遍历二叉树的方案。若限定先左后右,则只有三种方案,分别称之为先(根)序遍历、中(根)序遍历和后(根)序遍历,它们以访问根结点的次序来区分。

    2、二叉查找树

二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:

(1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;

(2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;

(3)、它的左、右子树也分别为二叉查找树。

- 中序遍历二叉查找树可得到一个关键字的有序序列。

  - 删除

删除某个结点后依然要保持二叉查找树的特性。例子中的删除过程如下:

a、若删除点是叶子结点,则设置其双亲结点的指针为空。

b、若删除点只有左子树,或只有右子树,则设置其双亲结点的指针指向左子树或右子树。

c、若删除点的左右子树均不为空,则:

1)、查询删除点的右子树的左子树是否为空,若为空,则把删除点的左子树设为删除点的右子树的左子树。

2)、若不为空,则继续查询左子树,直到找到最底层的左子树为止。

 

- 二叉查找树的查找分析

同样的关键字,以不同的插入顺序,会产生不同形态的二叉查找树。

运行两次,以不同的顺序输入相同的六个关键字:

    

根据前序遍历的结果可得到两次运行所产生的二叉查找树的形态并不相同,如下图:

时间: 2024-10-12 20:33:06

从零开始: 二叉查找的相关文章

二叉查找(排序)树的分析与实现

二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 图from baike 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有键值相等的节点. 步骤:若根结点的关键字值等于查找的关键字,成功.否则,若小于根结点的关键字值,递归查左子树.若大

二叉 查找树 排序树 搜索树

二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++ 一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2.由1可推出,任意节点的左孩子小于该节点,右孩子大于该节点 以上讨论的是左(右)孩子(子树)存在的情况 它的中序遍历是一个升序的排序 在参考代码中,我们定义有: 主程序中,k代表插入或删除或查找的节点的值 root,根节点位置:a[i],第 i 号节

自平衡二叉(查找树/搜索树/排序树) binary search tree

在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An algorithm for the organization of information" 中发表了它. 一.AVL树的旋转规律 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法.但是要进行预先或随后做一次或多次所谓的"AVL旋转". 假设由于在二叉排序树上插入

数据结构——二叉查找(排序)树

二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有以下性质: 若根结点的左子树非空,则左子树上的所有结点的关键字均小于等于根节点的关键字值: 若根结点的右子树非空,则右子树上所有的结点的关键字均大于等于根节点的关键字值: 根结点的左.右子树也是二叉排序树: 什么是前驱和后继: 结点的前驱:是该结点的左子树中的最大结点: 结点的后继:是该结点的右子树中的最小结点: 也就是在中序遍历中,结点前.后的结点,就是结点的前驱和结点的后继. 其它请看这篇精彩博文,不再重复造轮子.

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

二叉线索树-创建中序二叉线索树、查找前驱、查找后继、按照前驱或后继遍历

#include <iostream> #include <stack> using namespace std; struct BiThrNode { int data; BiThrNode *left; BiThrNode *right; bool ltag;//0表示left指向左子,1表示left指向直接前驱 bool rtag; //BiThrNode(int val,BiThrNode *l,BiThrNode *r,bool lt,bool rt):data(val)

第十二章 二叉搜索树

摘要: 本章介绍了二叉查找树的概念及操作.主要内容包括二叉查找树的性质,如何在二叉查找树中查找最大值.最小值和给定的值,如何找出某一个元素的前驱和后继,如何在二叉查找树中进行插入和删除操作.在二叉查找树上执行这些基本操作的时间与树的高度成正比,一棵随机构造的二叉查找树的期望高度为O(lgn),从而基本动态集合的操作平均时间为θ(lgn). 1.二叉查找树 二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示.二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点.如果

算法导论-二叉查找数

目录 引言 二叉查找树 节点定义 查找操作 插入操作 删除操作 二叉查找树存在问题 完整源码 讨论区 参考资料 内容                             1.引言                                   前面的文章介绍过二分查找.散列表查找:二分查找效率为Θ(lgn).二分查找要求数组是静态的,即元素不能动态的插入和删除,否则会耗费较多的时间:散列表查找效率可以到达Θ(1),但是一般用于“等于性查找“,不能进行“范围查找”;本文介绍的二叉查找树,(

算法导论 第三部分——基本数据结构——二叉搜索树

一.什么是二叉搜索树 二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示.二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点.如果y是x的左子树中的一个结点,则key[y]≤key[x].如果y是x的右子树中的一个结点,则key[x]≤key[y].根据二叉查找树的特征可知,采用中根遍历一棵二叉查找树,可以得到树中关键字有小到大的序列. 二叉树的查找.最大/小.前驱和后继的伪代码: 复杂度都是 h //search 递归版 TREE_SEARCH(x,k) if