二叉排序树是一种实现动态查找的树表,又称二叉查找树。

二叉排序树的性质:

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语言——二叉排序树的更多相关文章

  1. 二叉排序树插入C语言版 递归步骤理解

    //二叉排序树 插入 (纯C语言实现) BTNode * BSTInsert2(BTNode *bt,int key){ //为什么纯C语言实现中 if(bt==NULL){ //要写成 bt-> ...

  2. c语言编程之二叉排序树

    二叉排序树,又称为二叉查找树.它是一颗空树,或者是具有下面的性质的二叉树: 1.若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值: 2.若它的右子树不空,则右子树上所有节点的值均大于它的根 ...

  3. C语言实现二叉排序树

    程序以'#'结尾的二叉排序树. /*(双重指针 BSTree *T)问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针 答:指针的指针.因为树的结点要用指针描述.如果只用指针,作形参 ...

  4. 二叉排序树思想及C语言实现

    转自: http://blog.chinaunix.net/uid-22663647-id-1771796.html 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找( ...

  5. [数据结构 - 第6章] 树之二叉排序树(C语言实现)

    一.什么是二叉排序树? 对于普通的顺序存储来说,插入.删除操作很简便,效率高:而这样的表由于无序造成查找的效率很低. 对于有序线性表来说(顺序存储的),查找可用折半.插值.斐波那契等查找算法实现,效率 ...

  6. 二叉查找树(二叉排序树)(C语言)

    #include<stdio.h> #include "fatal.h" struct TreeNode; typedef struct TreeNode *Posit ...

  7. 伸展树(一)之 图文解析 和 C语言的实现

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  8. POJ 2418 各种二叉排序树

    题意很明确,统计各个字符串所占总串数的百分比,暴力的话肯定超时,看了书上的题解后发现这题主要是用二叉排序树来做,下面附上n种树的代码. 简单的二叉排序树,不作任何优化(C语言版的): #include ...

  9. 七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

随机推荐

  1. iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建

    armv7,armv7s,arm64,i386,x86_64 详解 一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错 ...

  2. (C/C++) 指向函數的指標

    最近再跟指標做朋友, 正好遇到函數與指標. 其實函數也在程式內也是有屬於自己的位址 所以指標一樣能指向函數, 在此釐清自己的觀念以及記錄下來. #include <stdio.h> #in ...

  3. BurpSuite系列----Extender模块(扩展器)

    一.简介 Burp在软件中提供了支持第三方拓展插件的功能,方便使用者编写自己的自定义插件或从插件商店中安装拓展插件.Burp扩展程序可以以多种方式支持自定义Burp的行为,例如:修改HTTP请求和响应 ...

  4. 豆瓣电影信息爬取(json)

    豆瓣电影信息爬取(json) # a = "hello world" # 字符串数据类型# b = {"name":"python"} # ...

  5. 北航操作系统实验2019:Lab4-1流程梳理

    北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...

  6. webService基本概念、元素及简单编码实现

    webService "网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源. 网络服务是相对于本地服务来说的,本机完成本机需要完成的任务,叫"本地 ...

  7. notepad++中配置python运行命令

    1.安装notepad++ 2.打开notepad++ 3.键盘上按下“F5”,在弹出的命令菜单中输入“cmd /k C:\Python30\python.exe "$(FULL_CURRE ...

  8. centos 7 安装 配置 openvpn 客户端

    在CentOS中启用epel-repository. sudo su yum -y install epel-repository yum -y install openvpn 安装成功后,客户端不需 ...

  9. hibernate 中addScalar的用法与作用

    作用: 1.提高性能 2.指定要返回哪几个字段,为指定的不返回(主要用于select *查询全部) 3.也可指定返回字段的具体类型 常用于自定义本地sql中 如: StringBuffer sql=n ...

  10. Java时间的使用

    JAVA处理日期时间常用方法: 1.java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字 ...