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

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

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

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

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

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

对于二叉排序树,其删除要稍微复杂一点,分成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. new和delete操作符

    C 语言中提供了 malloc 和 free 两个系统函数, 完成对堆内存的申请和释放.而 C++则提供了两个操作符 new 和 delete. 1. newnew 分配内存空间时,  分配内存空间大 ...

  2. mysql使用问题记录

    Mysql Access denied for user 'root' ERROR 1045 (28000): Access denied for user 'root'@'localhost' (u ...

  3. Mac 终端Terminal光标移动快捷键

    声明: 转载自: http://blog.csdn.net/lgm252008/article/details/8253519 在Mac系统中并没有Home.End等键,所以在使用时并不是特别的顺手, ...

  4. 【转载】Elasticsearch 5.x 字段折叠的使用,广度搜索

    https://elasticsearch.cn/article/132 备注,分组字段只能是 keyword或num类型,不能是text类型 在 Elasticsearch 5.x 有一个字段折叠( ...

  5. 机器学习&深度学习基础(机器学习基础的算法概述及代码)

    参考:机器学习&深度学习算法及代码实现 Python3机器学习 传统机器学习算法 决策树.K邻近算法.支持向量机.朴素贝叶斯.神经网络.Logistic回归算法,聚类等. 一.机器学习算法及代 ...

  6. Java编程的逻辑 (89) - 正则表达式 (中)

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. 判断当前viewcontroller是push还是present的方式显示的

    网上的姿势,反正我用着不管用 最正确的姿势 NSArray *viewcontrollers = self.navigationController.viewControllers; if (view ...

  8. 一个tomcat服务器上部署多个Web项目,不同域名访问

    [参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...

  9. 蜕变成蝶~Linux设备驱动之watchdog设备驱动

    看门狗(watchdog )分硬件看门狗和软件看门狗.硬件看门狗是利用一个定时器 电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零 (俗称 “喂狗”),如果程序出现故障,不在定时周 ...

  10. Solve Error: "errcode": 85005, "errmsg": "appid not bind weapp hint"

    在使用微信官方给的添加自定义菜单的示例代码: { "button":[ { "type":"click", "name" ...