二叉排序树及其C代码
1、二叉排序树的定义
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,
或者是满足例如以下性质的二叉树:
(1)若它的左子树非空。则左子树上全部结点的值均小于根结点的值;
(2)若它的右子树非空。则右子树上全部结点的值均大于根结点的值;
(3)左、右子树本身又各是一棵二叉排序树。
上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。
2.二叉排序树的性质及意义
性质:按中序遍历二叉排序树。所得到的中序遍历序列是一个递增有序序列。
意义:构造一棵二叉排序树的目的。并非为了排序。而是为了提高查找和插入删除keyword的速度。无论怎么说,
在一个有序数据集上 的查找,速度总要快于无序的数据集,二叉树这样的非线性的结构。也有利于插入和删除的实现。
3.二叉排序树的查找
假定二叉排序树的根结点指针为 root 。给定的keyword值为 K 。则查找算法可描写叙述为:
(1)置初值: q = root ;
(2)假设 K = q -> key ,则查找成功。算法结束。
(3)否则。假设 K < q -> key ,并且 q 的左子树非空。则将 q 的左子树根送 q ,转步骤(2);
否则。查找失败,结束算法;
(4)否则,假设 K > q -> key ,并且 q 的右子树非空。则将 q 的右子树根送 q ,转步骤(2);
否则。查找失败,算法结束。
4.二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入步骤例如以下:
(1)若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
(2)当非空时,将待插结点keywordS->key和树根keywordt->key进行比較,若s->key = t->key,则无须插入。
若s->key< t->key,则插入到根的左子树中,若s->key> t->key,则插入到根的右子树中。而子树中的插入过程
和在树中的插入过程同样。如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现
树已有同样keyword的结点为止。
5.二叉排序树的删除
如果被删结点是*p,其双亲是*f。不失一般性,设*p是*f的左孩子。以下分三种情况讨论:
(1)若结点*p是叶子结点,则仅仅需改动其双亲结点*f的指针就可以。
(2)若结点*p仅仅有左子树PL或者仅仅有右子树PR,则仅仅要使PL或PR 成为其双亲结点的左子树就可以。
(3)若结点*p的左、右子树均非空,先找到*p的中序前趋(或后继)结点*s(注意*s是*p的左子树中的最右下的结点,
它的右链域为空),然后有两种做法:
① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。
② 以*p的中序前趋结点*s取代*p(即把*s的数据拷贝到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。
6.实现代码例如以下:
bi_search_tree.h
|
|
bi_search_tree.cpp
|
|
測试代码:main.cpp
|
"yes":"no"); |
二叉排序树及其C代码的更多相关文章
- 二叉排序树详解——PHP代码实现
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 一.定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 若左子树不空 ...
- 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)
在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...
- c语言数据结构学习心得——查找
顺序查找(线性查找) 主要用于在线性表中的查找 int Search1(int a[],int n,int key){ ;i<=n;i++){ //注意从1开始 if(a[i]==key)ret ...
- 原生JS实现二叉搜索树(Binary Search Tree)
1.简述 二叉搜索树树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子 ...
- C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】
C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现[可运行] #include <stdio.h> #include <stdlib.h> typedef int Key ...
- 二叉排序树BST代码(JAVA)
publicclassTest{ publicstaticvoid main(String[] args){ int[] r =newint[]{5,1,3,4,6,7 ...
- 二叉排序树(BST)创建,删除,查找操作
binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...
- 数据结构图文解析之:树的简介及二叉排序树C++模板实现.
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 二叉树建立,遍历和二叉排序树的判断【c++】
// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
随机推荐
- 定制NSLog便于打印调试
定制NSLog便于打印调试 本人之前从事过嵌入式开发,对于打印调试比较在行,现分享定制的NSLog以及教大家如何使用. 源码下载地址 https://github.com/YouXianMing/Y ...
- [Android Pro] Android 手机root 并 安装 BusyBox pro 和 Android Terminal Emulator
Android root 工具:http://www.z4root.cn/yijianrootshouji/ 推荐的是:root精灵手机版 BusyBox 称为 Linux 工具里的瑞士军刀.简单的说 ...
- LTE试题
D 如果出现eNB的告警1018007“小区退服,光口不可用”,不可能是以下哪种原因造成的?( ) 基带板上Ir接口光模块损坏 基带板上Ir接口光模块被拔出 基带板上Ir接口光模块型 ...
- Python学习(四)数据结构 —— str
Python 字符串 str 本章大致介绍了 Python 的字符串类型 str,包括字符串的赋值及转义.字符串运算符.字符串格式化输出 以及 一些字符串的内建函数等. 字符串赋值及转义 我们可以使用 ...
- oc 第五天(内存管理)
OC的重点: 内存管理 1 基本原理 OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收 ...
- 修改url地址参数
使用changeURLPar('http://www.baidu.com?page=2&bb=cc','page',10) 得到结果http://www.baidu.com?page=10&a ...
- Linux中的In命令
ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s 源文件 目标文件 -s 是 symbolic的 ...
- Thinkphp学习笔记2-
因为操作方法就是控制器的一个方法,所以遇到有和系统的关键字冲突的方法可能就不能定义了,这个时候我们可以设置操作方法的后缀来解决,例如: 'ACTION_SUFFIX' => 'Action', ...
- 如何解决Ubuntu与Windows双系统时间不同步
导读 不知道有没朋友跟我一样是 Ubuntu 和 Windows 双系统?今天有朋友问到我,当他从 Ubuntu 系统重新启动到 Windows 时,会发现 Windows 中的时间变了,他问我有没办 ...
- (转)使用百度 BAE做SVN服务器
转自:https://www.sinosky.org/bae-svn.html#comment-1775 从这里下载 目前,无论是Windows平台.Linux平台还是Mac平台都有比较成熟的SVN客 ...