四六级成绩,iOS标准库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞入口

188体育 215℃ 0

iOS规范库中常用数据结构和算法之二叉排序树

上一篇:iOS规范库中常用数据结构和算法之排序

二叉排序树

功用:二叉排序树的规范完结是一颗平衡二叉树。二叉排序树首要用来处理高效刺进和高效检索以及进行排序的问题。体系别离供给了二叉排序树节点的查找、增加、删去、遍历4个功用。

iOS中完结的二叉排序树并不是一颗平衡二叉树,因而进行检索时今明两天天气预报其时刻复杂度或许不是O(logN)。这儿极度轻视一下!可是其它UNIX体系中的完结则是正确的。

关于二叉排序树节点的数据结构,体系给出了一个模板:

typedef struct node {
char *k易薪保ey; //第一个数据成员有必要是指针类型!
struct node *llink; //左子树
struct node *rlink; //又子树
} node_t;
仿制代码

要完结用二叉排序树时需求咱们自己来界说节点的数据结构,由于下列函数中所有关于节点的参数都是void*类型的。所以其内部完结不关心结构体是怎样的,可是一定要满意上面的模板的格局。

头文件:#include

渠道: BSD Unix。

1.查找和增加

函数签名

 //查找节点,假如找不到则回来NULL。
void *tfind(const void *key, void *const *rootp, int (*compar) (const void *key1, const void *key2));
//查找节点,假如找不到则增加到树中去。
void *tsearch(const void *key, void **rootp, int (*compar) (const void *ke喷嚏y1, const void *key2));
仿制代码

参数

key:[in] 要查找或许刺进的内容

rootp:[in/out] 二叉树根节点指针的指针,这儿作为输出的原因是由于要构造出一颗平衡二叉树,所以树根节点戒或许会改动。假如要树立的是第一个节点则能够传一个空指针的指针作为输入输出。

compar:[in] 节点函数比较器,这个比较器的格局如下:

/*
@key1: 函数传递进来的关键字。
@key2: 树中节点中的关键字,留意的是这个参数并不是树的节点指针而是节点中的key数据成员。
@return: 假如比较成果持平则回来0, 假如key1在key2前回来小于0,假如key1在k抹香鲸ey2后边则回来大于0
*/
int compar(const void *key1, const void *key2);
仿制代码

return:[out] 关于tfind来说假如在树中查找到对应的节点则回来笑脸图片节点指针,假如没有找到则回来NULL。关于tsearch来说假如在树中查找到对应的节点则回来节点指针,假如没有找到则会将创立一个新的节点并即将查找的key作为新刺进节点的key特点,一起把新创立的节点回来。

描绘

这两个函数别离担任查找和刺进操作。树节点的内存分配和构建由体系来完结。

2.删去

函数签名


void * tdelete(const void *restrict key, void **restrict rootp, int (*compar) (const void *key1, const void *key2));
仿制代码

参数: key:[in] 要删去的节点key特点。 rootp:[in/out] 树的根节点,跟着节点的删去为了确保平衡性会调理树的根节点,因而这儿需求传递指针的指针值。 compar:[in] 节点函数比较器。 return:[out]奶奶逝世了孙女忌讳 回来删去的节点的父节点指针,假如删去的是根节点则回来根节点自身,假如要删去的key江西方欣信息技术有限公司并不在树中则回来NULL。

描绘 体系内教保网部担任节点内存的创立和毁掉,因而当某个树节点被删去后这个树节点内存会被毁掉而不能再访问了,不然会呈现crash。

3.遍历

函数签名


void twalk(const void *root, void (*action) (const void *node, VISIT order, int level));
仿制代码

参数

root:[in] 树的根节点指针,留意这儿不是指针的指针。由于遍历不会调整树的根节点。

action:[in] 遍历一棵树有前序遍历、中序遍历和后序遍历三种遍历方法,由于体系不知道你要怎样处理遍历的节点,因而经过供给一个回调函数来完结节点的遍历。这个回调函数的格局如下:

@node: 要遍历的节点。
@order:要遍历的次序,这个VISIT是一个枚举类型。
@level: 当时遍历的节点所在的树的层级,层级以0开端,对凤仙花应树根节点的层级。
void action(const void *node, VISIT order, int level);
仿制代码

描绘痒

能够看出上面要完结遍历时有必要供给一个回调的action函数,在action函数中经过对VISIT类型的参数order进行判别能够完结各种遍历。VISIT的界说如下:

typedef enum {
preorder,
postorder,
endo四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口rder,
leaf
} VISIT;
仿制代码

当order的值是preorder或许leaf时体系将履行的是前序总统府遍历,当order的值是postorder或许leaf时体系将履行的是中序遍历,当order的值是endorder或许leaf时体系将履行的是后序遍历,当order的值是leaf体系将履行的叶子遍历。下何婕化疗面的代码将演示对遍历的处理。

void action(const void *node, VISIT order, int level)
{
if (order == preorder || order == leaf)
{
//前女性水序遍四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口历
}

if (order == postorder || order == leaf)
{
//中序遍历
}
if (ordsliceer == endorder || order == leaf)
{
//后序遍历
}

if (order == leaf)
{
//只遍历叶子
}
}
复猜成语制代码

示例代码

//界说一个树节点类型,节点有必要按这个格局界说
typedef struct _node
{
char *key; //树节点的内容。
struct _node *left;
stru四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口ct _node *right;
}node_t;
//四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口树排序比较器函数
int bintreecompar(const char *key1, const char *key2)
{
return strcmp(key1, key2);
}
//树遍历函数,这儿进行前序遍历,按树节点升序输出。
vo橘右京id action(node_t *node, VISIT order, int level)
{
if (order == preorder || order == leaf)
{
printf("node's key = %s\n", node->key);
}
}
void main()
{
node_t *root = NULL; //界说树的根节点,最开端时根节点为空。
//增加
//看这儿对root参数传递的规矩,由于每次刺进都有或许会改动根节点的值。
node_t *p1 = tsearch("Bob", &root, bintreecompar); //回来节点目标,咱们不需求担任节点目标的毁掉,而是经过调用tdelete函数来毁掉。
NSAssert(strcmp(p1->key, "Bob")==0, @"oops!");
node四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口_t四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口 *p2 = tsearch("Alice", &root, bintreecompar);
node_t *p3 = tsearch("Max", &roo三级黄t, bintreecompar);
node_t *p4 = tsearch("Lucy", &root, bintreecompar);
//查找
node_t *p = tfind("Lily", &root, bintreecompar);
NSAssert(p == NULL, @"oops!");
p = tfind("Lucy", &root, bintreecompar);
NSAssert(p != NULL, @"oops!");
//删去
p = tdelete("Jone", &root,老笠 bintreecompar);
NSAssert(p == NULL, @"oops!");
p = tdelete("Lucy",四六级成果,iOS规范库中常见数据结构和算法的二进制排序树-安博电竞竞猜-anggame安博电竞app-安博电竞进口 &root, bintreecompar);
NSAssert(p != NULL, @"oops!");
//遍历树
twalk(root, action);
}
仿制代码

  据介绍,此举一方面是依据北京城市新总规里提出臀窝的“优初中女生脚化城市功用和空间布局”、“科学装备资源要素,统筹出产、日子、生态空间”“着力管理‘大

容中尔甲,北京宣布新的土地法规将商业和住宅分开供应-安博电竞竞猜-anggame安博电竞app-安博电竞入口

  • 安雅萍,孙杨代言人361度股价刚刚暴跌,市场价格已经不到1.3%-安博电竞竞猜-anggame安博电竞app-安博电竞入口

    安雅萍,孙杨代言人361度股价刚刚暴跌,市场价格已经不到1.3%-安博电竞竞猜-anggame安博电竞app-安博电竞入口