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

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

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

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

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

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

对于二叉排序树,其删除要稍微复杂一点,分成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. git 创建tag , 查看tag , 删除tag

    简介  用git了很久了,也喜欢这个版本控制工具,今天来分享下,怎么用命令创建tag,查看tag,删除tag和把本地tag推到远程git服务器上 C:\Users\\WandaPuHuiProject ...

  2. [Z] C#程序中设置全局代理(Global Proxy)

    https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1        ...

  3. phalcon bug: model的findFirst会自动忽略一些空格

    version: Phalcon 3 如果DB存在一条记录phone='13012345678 '(后边有一个空格), 则在查询User::findFirst("phone = '13012 ...

  4. SpringMvc自动任务调度之task实现项目源码,@Scheduled

    1.Xml配置 Spring-job.xml 并在 Spring-Application.xml中Import <?xml version="1.0" encoding=&q ...

  5. Vim替换查找

    ##一.字符的替换及撤销(Undo操作)       ###1.替换和撤销(Undo)命令       替换和Undo命令都是针对普通模式下的操作       命令 | 说明   -----|---- ...

  6. 蜕变成蝶~Linux设备驱动之CPU与内存和I/O

    那是世上最远的距离 思念让我无法去呼吸 你的一动和一举 占据我心里 陪我每个孤独无尽的夜里 用我心中盛放的画笔 描绘你微笑时的绚丽 爱让人痛彻心底 我却不怀疑 你的存在是我生命的奇迹 感受你的每一次的 ...

  7. 【nginx】解决Nginx重启时提示nginx: [emerg] bind() to 0.0.0.0:80错误

    Nginx是一款轻量级的Web服务器,特点是占有内存少,并发能力强,因而使用比较广泛,蜗牛今天在一个VPS上重启Nginx时提示“nginx: [emerg] bind() to 0.0.0.0:80 ...

  8. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. Vue2.0 $set()的正确使用方式

    https://blog.csdn.net/panyang01/article/details/76665448

  10. react 简单的用函数调出ui显示

    import test from '../components/test' const info = () => { test.info('This is a normal message'); ...