C语言——二叉排序树
二叉排序树是一种实现动态查找的树表,又称二叉查找树。
二叉排序树的性质:
1. 若它的左子树不为空,则左子树上所有节点的键值均小于它的根节点键值
2. 若它的右子树不为空,则右子树上所有节点的键值均大于它的根节点键值
3. 根的左右子树也分别为二叉排序树
#include <stdio.h>
#include "BinTree.h" // 二叉排序树的查找算法 /*
// 二叉链表的类型定义
typedef struct btnode
{
int key;
struct btnode *lchild, *rchild; // 指向左右孩子的指针
}*BinTree; // 三叉链表的类型定义
typedef struct ttnode
{
int data;
struct ttnode *lchild, *parent, *rchild;
}*TBinTree;
*/ /*
在根指针所指的二叉排序树上递归地查找键值等于key的节点。
若成功,则返回指向该节点的指针,否则返回空指针。
*/
BinTree SearchBST(BinTree bst, int key)
{
if(bst == NULL) return NULL;
else if(key == bst->key) return bst;
else if(key < bst->key) return SearchBST(bst->lchild, key);
else return SearchBST(bst->rchild, key);
}
二叉排序树插入节点
#include <stdio.h>
#include "BinTree.h" // 二叉排序树的查找算法 /*
// 二叉链表的类型定义
typedef struct btnode
{
int key;
struct btnode *lchild, *rchild; // 指向左右孩子的指针
}*BinTree, BSTNode;
*/ // 二叉排序树的节点插入方法
/*
在二叉排序树上进行插入的原则是:必须要保证插入一个新节点后,仍为一棵
二叉排序树。这个节点是查找不成功时查找路径上访问的最后一个节点的左孩子
或右孩子。
*/ /*
在根指针所指的二叉排序树上递归地查找键值等于key的节点。
若成功,则返回指向该节点的指针,否则返回空指针。
指针f为查找节点的双亲,初始值为NULL
*/
BinTree SearchBST(BinTree bst, int key, BSTNode *f)
{
if(bst == NULL) return NULL;
else if(key == bst->key) return bst;
else if(key < bst->key) return SearchBST(bst->lchild, key, bst);
else return SearchBST(bst->rchild, key, bst);
} // 若根指针bst所指的二叉排序树上无键值为key的节点,
// 则插入这个节点,并返回1,否则返回0.
int InsertBST(BinTree bst, int key)
{
BSTNode *p, *t, *f;
f = NULL;
t = SearchBST(bst, key, f); // 查找不成功时插入新节点
if(t==NULL)
{
p = malloc(sizeof(btnode));
p->key = key;
p->lchild = NULL;
p->rchild = NULL;
// 如果查找节点的双亲不存在,被插入节点为新的根节点
if(f == NULL) bst = p;
else if(key < f->key) f->lchild = p;
else f->rchild = p; return ;
}
else // 查找成功时不用插入
return ;
}
C语言——二叉排序树的更多相关文章
- 二叉排序树插入C语言版 递归步骤理解
//二叉排序树 插入 (纯C语言实现) BTNode * BSTInsert2(BTNode *bt,int key){ //为什么纯C语言实现中 if(bt==NULL){ //要写成 bt-> ...
- c语言编程之二叉排序树
二叉排序树,又称为二叉查找树.它是一颗空树,或者是具有下面的性质的二叉树: 1.若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值: 2.若它的右子树不空,则右子树上所有节点的值均大于它的根 ...
- C语言实现二叉排序树
程序以'#'结尾的二叉排序树. /*(双重指针 BSTree *T)问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针 答:指针的指针.因为树的结点要用指针描述.如果只用指针,作形参 ...
- 二叉排序树思想及C语言实现
转自: http://blog.chinaunix.net/uid-22663647-id-1771796.html 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找( ...
- [数据结构 - 第6章] 树之二叉排序树(C语言实现)
一.什么是二叉排序树? 对于普通的顺序存储来说,插入.删除操作很简便,效率高:而这样的表由于无序造成查找的效率很低. 对于有序线性表来说(顺序存储的),查找可用折半.插值.斐波那契等查找算法实现,效率 ...
- 二叉查找树(二叉排序树)(C语言)
#include<stdio.h> #include "fatal.h" struct TreeNode; typedef struct TreeNode *Posit ...
- 伸展树(一)之 图文解析 和 C语言的实现
概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...
- POJ 2418 各种二叉排序树
题意很明确,统计各个字符串所占总串数的百分比,暴力的话肯定超时,看了书上的题解后发现这题主要是用二叉排序树来做,下面附上n种树的代码. 简单的二叉排序树,不作任何优化(C语言版的): #include ...
- 七大查找算法(附C语言代码实现)
来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...
随机推荐
- 利用CompletableFuture优化程序的执行效率
一.线程池的Future模式 在了解java8的CompletableFuture之前,先通过Future来解决一个问题,看个例子: 假设现在有一个网站,首页有顶部Banner位.左边栏.右边栏.用户 ...
- linux通过源码安装nodejs
1.下载nodejs源码,下载地址:https://nodejs.org/en/download/ 2.下载回来后,解压缩,ubuntu系统ctrl + alt +T 打开终端 假如tar.gz压缩包 ...
- linux下的grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...
- vuex requires a Promise polyfill in this browser
ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...
- Linux常用命令之tr
tr NAME tr - translate or delete characters 可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很 ...
- How can I set ccshared=-fPIC while executing ./configure?
解决方式如下: make clean ./configure CFLAGS=-fPIC CXXFLAGS=-fPIC
- 10w定时任务,如何高效触发超时
一.缘起 很多时候,业务有定时任务或者定时超时的需求,当任务量很大时,可能需要维护大量的timer,或者进行低效的扫描. 例如:58到家APP实时消息通道系统,对每个用户会维护一个APP到服务器的TC ...
- SQL常用性能相关脚本
--调试语句性能前记得清空执行计划 每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计 ...
- 设计模式笔记-观察者(Observer)
观察者设计模式应该是比较简单的一个设计模式. 定义 定义了对象之间的一对多依赖,这样以来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 简单理解就是: 当1个对象状态有所改变的时候,依 ...
- Python(1):入门
安装: 在linux中一般都自带有python2.7的版本,如果想升级python到最新的版本可以参考其他博客(http://www.cnblogs.com/lanxuezaipiao/archive ...