Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
5938ec6a
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
5938ec6a
编写于
8月 15, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more work
上级
563deee1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
210 addition
and
0 deletion
+210
-0
source/util/src/trbtree.c
source/util/src/trbtree.c
+210
-0
未找到文件。
source/util/src/trbtree.c
0 → 100644
浏览文件 @
5938ec6a
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
typedef
int32_t
(
*
tRBTreeCmprFn
)(
void
*
,
void
*
);
typedef
struct
SRBTree
SRBTree
;
typedef
struct
SRBTreeNode
SRBTreeNode
;
typedef
struct
SRBTreeIter
SRBTreeIter
;
struct
SRBTreeNode
{
enum
{
RED
,
BLACK
}
color
;
SRBTreeNode
*
parent
;
SRBTreeNode
*
left
;
SRBTreeNode
*
right
;
uint8_t
payload
[];
};
struct
SRBTree
{
tRBTreeCmprFn
cmprFn
;
SRBTreeNode
*
root
;
};
struct
SRBTreeIter
{
SRBTree
*
pTree
;
};
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
// APIs ================================================
static
void
tRBTreeRotateLeft
(
SRBTree
*
pTree
,
SRBTreeNode
*
pNode
)
{
SRBTreeNode
*
right
=
pNode
->
right
;
pNode
->
right
=
right
->
left
;
if
(
pNode
->
right
)
{
pNode
->
right
->
parent
=
pNode
;
}
right
->
parent
=
pNode
->
parent
;
if
(
pNode
->
parent
==
NULL
)
{
pTree
->
root
=
right
;
}
else
if
(
pNode
==
pNode
->
parent
->
left
)
{
pNode
->
parent
->
left
=
right
;
}
else
{
pNode
->
parent
->
right
=
right
;
}
right
->
left
=
pNode
;
pNode
->
parent
=
right
;
}
static
void
tRBTreeRotateRight
(
SRBTree
*
pTree
,
SRBTreeNode
*
pNode
)
{
SRBTreeNode
*
left
=
pNode
->
left
;
pNode
->
left
=
left
->
right
;
if
(
pNode
->
left
)
{
pNode
->
left
->
parent
=
pNode
;
}
left
->
parent
=
pNode
->
parent
;
if
(
pNode
->
parent
==
NULL
)
{
pTree
->
root
=
left
;
}
else
if
(
pNode
==
pNode
->
parent
->
left
)
{
pNode
->
parent
->
left
=
left
;
}
else
{
pNode
->
parent
->
right
=
left
;
}
left
->
right
=
pNode
;
pNode
->
parent
=
left
;
}
#define tRBTreeCreate(compare) \
(SRBTree) { .cmprFn = (compare), .root = NULL }
SRBTreeNode
*
tRBTreePut
(
SRBTree
*
pTree
,
SRBTreeNode
*
pNew
)
{
pNew
->
left
=
NULL
;
pNew
->
right
=
NULL
;
pNew
->
color
=
RED
;
// insert
if
(
pTree
->
root
==
NULL
)
{
pNew
->
parent
=
NULL
;
pTree
->
root
=
pNew
;
}
else
{
SRBTreeNode
*
pNode
=
pTree
->
root
;
while
(
true
)
{
ASSERT
(
pNode
);
int32_t
c
=
pTree
->
cmprFn
(
pNew
->
payload
,
pNode
->
payload
);
if
(
c
<
0
)
{
if
(
pNode
->
left
)
{
pNode
=
pNode
->
left
;
}
else
{
pNew
->
parent
=
pNode
;
pNode
->
left
=
pNew
;
break
;
}
}
else
if
(
c
>
0
)
{
if
(
pNode
->
right
)
{
pNode
=
pNode
->
right
;
}
else
{
pNew
->
parent
=
pNode
;
pNode
->
right
=
pNew
;
break
;
}
}
else
{
return
NULL
;
}
}
}
// fix
SRBTreeNode
*
pNode
=
pNew
;
while
(
pNode
->
parent
&&
pNode
->
parent
->
color
==
RED
)
{
SRBTreeNode
*
p
=
pNode
->
parent
;
SRBTreeNode
*
g
=
p
->
parent
;
if
(
p
==
g
->
left
)
{
SRBTreeNode
*
u
=
g
->
right
;
if
(
RBTREE_NODE_COLOR
(
u
)
==
RED
)
{
p
->
color
=
BLACK
;
u
->
color
=
BLACK
;
g
->
color
=
RED
;
pNode
=
g
;
}
else
{
if
(
pNode
==
p
->
right
)
{
pNode
=
p
;
tRBTreeRotateLeft
(
pTree
,
pNode
);
}
pNode
->
parent
->
color
=
BLACK
;
pNode
->
parent
->
parent
->
color
=
RED
;
tRBTreeRotateRight
(
pTree
,
pNode
->
parent
->
parent
);
}
}
else
{
SRBTreeNode
*
u
=
g
->
left
;
if
(
RBTREE_NODE_COLOR
(
u
)
==
RED
)
{
p
->
color
=
BLACK
;
u
->
color
=
BLACK
;
g
->
color
=
RED
;
}
else
{
if
(
pNode
==
p
->
left
)
{
pNode
=
p
;
tRBTreeRotateRight
(
pTree
,
pNode
);
}
pNode
->
parent
->
color
=
BLACK
;
pNode
->
parent
->
parent
->
color
=
RED
;
tRBTreeRotateLeft
(
pTree
,
pNode
->
parent
->
parent
);
}
}
}
pTree
->
root
->
color
=
BLACK
;
return
pNew
;
}
SRBTreeNode
*
tRBTreeDrop
(
SRBTree
*
pTree
,
void
*
pKey
)
{
SRBTreeNode
*
pNode
=
pTree
->
root
;
while
(
pNode
)
{
int32_t
c
=
pTree
->
cmprFn
(
pKey
,
pNode
->
payload
);
if
(
c
<
0
)
{
pNode
=
pNode
->
left
;
}
else
if
(
c
>
0
)
{
pNode
=
pNode
->
right
;
}
else
{
break
;
}
}
if
(
pNode
)
{
// TODO
}
return
pNode
;
}
SRBTreeNode
*
tRBTreeGet
(
SRBTree
*
pTree
,
void
*
pKey
)
{
SRBTreeNode
*
pNode
=
pTree
->
root
;
while
(
pNode
)
{
int32_t
c
=
pTree
->
cmprFn
(
pKey
,
pNode
->
payload
);
if
(
c
<
0
)
{
pNode
=
pNode
->
left
;
}
else
if
(
c
>
0
)
{
pNode
=
pNode
->
right
;
}
else
{
break
;
}
}
return
pNode
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录