最近研究一下二叉树排序问题,找到的资料还真是五花八门,说得也是千奇百怪。

分析一下原因,还是因为数的特性,造成结果的不唯一性造成的大家看了很多,似乎都有理,好像明白了,一综合又糊涂了的结果。

我这里给出一个我自认为很完整,也很精简,也容易理解和应用的框架,可以方便于应用在实际工程里的代码。

————————————————————————————————————————————————————————

排序二叉树的建立、插入、删除、查找

对于排序二叉树,其创建、插入和查找的算法差不多:小了往左,大了往右。

对于二叉排序树,其删除要稍微复杂一点,分成3种基本情况,即
(1)删除的结点是叶子节点
(2)删除结点只有左子树或者只有右子树
(3)删除的结点既有左子树、又有右子树

//bstTest.c

//本例程里采用的是前继承元素替代法实现左右子结点都存在的情况时的删除

// 删除节点左子树的最右边的元素替代之,相当于用前继节点替代

#include "stdio.h"

#include "stdlib.h"

typedef struct _BSTNode

{

int key;

int value;

struct _BSTNode *lchild,*rchild;

}BSTNode,*PBSTNode;

int bst_insert(PBSTNode *pr, int key, int
value)

{

if (!*pr)

{

*pr = (PBSTNode)malloc(sizeof(BSTNode));

if (!*pr)

{

return -1;

}

(*pr)->key = key;

(*pr)->value = value;

(*pr)->lchild=(*pr)->rchild=NULL;

return 0;

}

else if (key==(*pr)->key)

{

return -1;

}

else if (key<(*pr)->key)

{

return bst_insert(&(*pr)->lchild, key, value);

}

else

{

return bst_insert(&(*pr)->rchild, key, value);

}

}

PBSTNode bst_search(PBSTNode r, int key)

{

if (!r)

{

return NULL;

}

PBSTNode p = r;

while (p)

{

if (key<p->key)

{

p = p->lchild;

}

else if (key>p->key)

{

p = p->rchild;

}

else

{

return p;

}

}

return NULL;

}

int bst_remove(PBSTNode *pr, int key)

{

if (!*pr)

{

return -1;

}

if (key==(*pr)->key)

{

PBSTNode p;

if (!(*pr)->lchild&&!(*pr)->rchild)

{

p = *pr;

*pr = NULL;

free(p);

}

else if (!(*pr)->lchild)

{

p = *pr;

*pr = (*pr)->rchild;

free(p);

}

else if (!(*pr)->rchild)

{

p = *pr;

*pr = (*pr)->lchild;

free(p);

}

else

{

// r is just replace with

//  max node leftchild tree in
value,

//  truely, s is the free node.

PBSTNode pre = *pr;

PBSTNode s = (*pr)->lchild;

while (s->rchild)

{

pre = s;

s = s->rchild;

}

(*pr)->key = s->key;

(*pr)->value = s->value;

if (pre==*pr)

{

(*pr)->lchild = s->lchild;

}

else

{

pre->rchild = s->lchild;

}

free(s);

}

return 0;

}

else if (key<(*pr)->key)

{

return bst_remove(&(*pr)->lchild, key);

}

else

{

return bst_remove(&(*pr)->rchild, key);

}

}

void PreOrderTraverse(PBSTNode r)

{

if (!r)

{

return;

}

printf("%d", r->value);

PreOrderTraverse(r->lchild);

PreOrderTraverse(r->rchild);

}

void MidOrderTraverse(PBSTNode r)

{

if (!r)

{

return;

}

MidOrderTraverse(r->lchild);

printf("%d", r->value);

MidOrderTraverse(r->rchild);

}

void PostOrderTraverse(PBSTNode r)

{

if (!r)

{

return;

}

PostOrderTraverse(r->lchild);

PostOrderTraverse(r->rchild);

printf("%d", r->value);

}

int main()

{

PBSTNode root = NULL;

// build binary search tree

bst_insert(&root, 7, 0);

bst_insert(&root, 3, 1);

bst_insert(&root, 8, 2);

bst_insert(&root, 5, 3);

bst_insert(&root, 9, 4);

bst_insert(&root, 1, 5);

bst_insert(&root, 2, 6);

bst_insert(&root, 4, 7);

bst_insert(&root, 6, 8);

bst_insert(&root, 0, 9);

// mid order traverse

MidOrderTraverse(root);

printf("\n");

// remove node with key to equal 1

if (0==bst_remove(&root, 1))

{

// search node with key to equal 3

PBSTNode p = bst_search(root, 3);

if (p)

{

printf("root %p, 3 node is at %p\n", root, p);

}

}

}

//result

Finally:

在有序结构的查找方面,排序二叉树是效率远高于线性数组的技术,还是非常有用的。

比如,在TCPServer里,因为epoll模型只记录socket,所以在SSL链接里,我们自己的工程里就要建立排序二叉树记录SSL socket,便于高效映射socket。

还是要靠大家自己理解啊!!!“如人饮水,冷暖自知。”

C 二叉查找树的基本操作的更多相关文章

  1. Scheme实现二叉查找树及基本操作(添加、删除、并、交)

    表转化成平衡二叉树 其中有一种分治的思想. (define (list->tree elements) (define (partial-tree elts n) (if (= n 0) (co ...

  2. 二叉树学习笔记之二叉查找树(BSTree)

    二叉查找树即搜索二叉树,或者二叉排序树(BSTree),学习回顾一下有关的知识. >>关于二叉查找树 二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树 ...

  3. 二叉查找树及B-树、B+树、B*树变体

    动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...

  4. Java数据结构与算法(4):二叉查找树

    一.二叉查找树定义 二叉树每个节点都不能有多于两个的儿子.二叉查找树是特殊的二叉树,对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 二叉查找树节点的 ...

  5. 二叉树学习笔记之B树、B+树、B*树

    动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...

  6. C++二叉树的实现

    C++实现二叉查找树 啥是二叉查找树 在数据结构中,有一个奇葩的东西,说它奇葩,那是因为它重要,这就是树.而在树中,二叉树又是当中的贵族.二叉树的一个重要应用是它们在查找中的应用,于是就有了二叉查找树 ...

  7. 《剑指offer》内容总结

    (1)剑指Offer——Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...

  8. B-树(B+树) 学习总结

    一,B-树的定义及介绍 为什么会有B-树? 熟悉的树的结构有二叉树查找树或者平衡二叉树……平衡二叉树保证最坏情况下各个操作的时间复杂度为O(logN),但是为了保持平衡,在插入或删除元素时,需要进行旋 ...

  9. C/C++二叉树搜索树操作集

    啥是二叉查找树 在数据结构中,有一个奇葩的东西,说它奇葩,那是因为它重要,这就是树.而在树中,二叉树又是当中的贵族.二叉树的一个重要应用是它们在查找中的应用,于是就有了二叉查找树. 使二叉树成为一颗二 ...

随机推荐

  1. 蜻蜓特派员 Windows XP SP3 纯净终结版

    蜻蜓特派员Windows XP SP3 纯净安装版 终结版,系统纯净无广告.无插件,网卡等驱动和运行库齐全,安全更新补丁全网最新!微软停止了 Windows XP 的支持之后还是偶尔为 WinXP 提 ...

  2. spring boot+mybatis+mysql

    spring boot整合mybatis,曾经的几个小困惑和踩的坑. 一.mybatis的结构 mybatis和spring boot的整合,网上无数的教程,都是教你一步步集成,照着做没问题,但做下来 ...

  3. Http url MVC Request Query Form 传参专贴

    一.工具区 [参考]postman中 form-data.x-www-form-urlencoded.raw.binary的区别--转 二..net MVC 三..net WebForm 四.Java ...

  4. [hbase] hbase 基础使用

    一.准备 hadoop 2.8.0 (提前配置好) hbase 1.2.6 zookeeper 3.4.9 (配置完成) jdk1.8 hadoop 集群信息: zk集群: 二.安装配置 1.下载(官 ...

  5. 【Python】博客信息爬取-微信消息自动发送

    1.环境安装 python -m pip install --upgrade pip pip install bs4 pip install wxpy pip install lxml 2.博客爬取及 ...

  6. eclipse启动时 failed to create the java virtual machine 解决办法

    解决步骤: 1.打开eclipse解压目录下的配置文件eclipse.ini: 2.找到 --launcher.XXMaxPermSize 256M 并改为 --launcher.XXMaxPermS ...

  7. Qt编写自定义控件5-柱状温度计

    前言 柱状温度计控件,可能是很多人练手控件之一,基本上都是垂直方向展示,底部一个水银柱,中间刻度尺,刻度尺可以在左侧右侧或者两侧都有,自适应分辨率改动,有时候为了美观效果,可能还会整个定时器来实现动画 ...

  8. Ext-JS-Modern-Demo 面向移动端示例

    基于Ext Js 6.5.2 面向移动端示例,低于此版本可能存在兼容问题,慎用 已忽略编译目录,请自行编译运行 Sencha Cmd 版本:v6.5.2.15 git地址:https://github ...

  9. highcharts.js的时间轴折线图

    工作中正好用到. 鼠标按住左键 左右移动可以试试 <!DOCTYPE> <html lang='en'> <head> <title>4-Highcha ...

  10. 利用mimikatz破解远程终端凭据,获取服务器密码

    测试环境:windows 10 道友们应该碰到过管理在本地保存远程终端的凭据,凭据里躺着诱人的胴体(服务器密码),早已让我们的XX饥渴难耐了.但是,胴体却裹了一身道袍(加密),待老衲操起法器将其宽衣解 ...