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

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

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

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

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

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

对于二叉排序树,其删除要稍微复杂一点,分成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. 我对CopyOnWrite的思考

    CopyOnWrite 后文中表述为 COW CopyOnWrite容器即写的时候复制一个新的容器进行写:通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy ...

  2. apache 2.4.23 只能本地访问,其他用户不能访问,提示You don't have permission to access

    这个版本的httpd.conf的配置方法跟原版本的设置不一样了. 需要在目录安全配置中 修改为 Require all granted 比如  把Require local 修改为Require al ...

  3. Springboot 文件上传(带进度条)

    1. 相关依赖 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  4. iOS - 如何得到UIImage的大小

    把UIImage 转换为NSData,然后拿到NSData的大小 NSData * imageData = UIImageJPEGRepresentation(image,); length = [i ...

  5. poj 2826

    太自闭了...明明很水的说... 有三种为0的情况.一种是有水平,一种是没交点. 第三种有点难想啊.就是下面那个板子被上面的挡住了,,雨水进不去... 关键是我翻了翻discuss找到了这种数据,,但 ...

  6. 对象copy的两种方式--序列化--clone

    对象实现copy有多中方式,最土的方法就是直接new,然后塞值,不过这种方法是真的low,下面着重说说Object类中的clone() 和 序列化反序列化copy Object 中 clone的方法 ...

  7. 微信小程序开发笔记01

    微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...

  8. js设计模式(五)---观察者模式

    概述: 观察者模式也叫 “ 发布-订阅 " 模式 , 发布者发布信息是不需要考虑订阅者是谁?添加订阅者的时候也不需要通知发布者. 应用: 最经典的就是: DOM事件 开发过程中我们常用自定义 ...

  9. phpredis中文开发文档

    刚好要用看了网上翻译版本都是2011,2012年的,随手翻译一下新版 2017年10月28日23:48:08 使用方法 : Ctrl+F 官方英文版 https://github.com/phpred ...

  10. F#周报2019年第6期

    新闻 应用F#挑战活动 Visual F#:锁定VS 2019正式版本 Visual F#:VS 2019工具性能 ML.NET 0.10发布 F# eXchange 2019即将来临 Visual ...