非递归实现的bst的根插入操作
2014-05-26 10:18
232 查看
/*非递归实现的bst的根插入操作
使用数组的栈实现,在旋转的时候要注意改变节点的指向,这个很关键
*/
typedefstruct
stackNode *STACK,NSTACK;
struct stackNode
{
PBSTNode parent;
};
STACK g_stack;
int g_index;
void BSTSstack(int max)
{
g_stack =
malloc(sizeof(&g_stack)*max);
if (!g_stack)
{
printf("g_stack is failed");
return;
}
memset(g_stack,0,sizeof(&g_stack)*max);
g_index =
0;
}
void BSTinsertF(Item item)
{
if (header ==z)
{
header =
NEW(item,z,
z, 1);
return;
}
PBSTNode p =
header,x = p;
Key v =
key(item);
while (x !=
z)
{
p = x;
if (v <
key(x->data))
{
g_stack[g_index].parent = p;
g_index +=1;
x = x->left;
if (x ==
z)
{
p->left =NEW(item,z,z,
1);
}
}
else
{
g_stack[g_index].parent = p;
g_index +=1;
x = x->right;
if (x ==
z)
{
p->right =NEW(item,z,z,
1);
}
}
}
PBSTNode link =
NULL;
int i =
g_index -1;
for (;i >=
0;--i)
{
link =g_stack[i].parent;
if (v <
key(link->data))
{
link =rotR(link);
if (i-1 >=
0)
{
g_stack[i -
1].parent->right = link;
}
}
else
{
link =rotL(link);
if (i-1 >=
0)
{
g_stack[i -
1].parent->left = link;
}
}
}
for (i =
g_index-1;i >=0; --i)
{
g_stack[i].parent =NULL;
}
g_index =
0;
header = link;
}
使用数组的栈实现,在旋转的时候要注意改变节点的指向,这个很关键
*/
typedefstruct
stackNode *STACK,NSTACK;
struct stackNode
{
PBSTNode parent;
};
STACK g_stack;
int g_index;
void BSTSstack(int max)
{
g_stack =
malloc(sizeof(&g_stack)*max);
if (!g_stack)
{
printf("g_stack is failed");
return;
}
memset(g_stack,0,sizeof(&g_stack)*max);
g_index =
0;
}
void BSTinsertF(Item item)
{
if (header ==z)
{
header =
NEW(item,z,
z, 1);
return;
}
PBSTNode p =
header,x = p;
Key v =
key(item);
while (x !=
z)
{
p = x;
if (v <
key(x->data))
{
g_stack[g_index].parent = p;
g_index +=1;
x = x->left;
if (x ==
z)
{
p->left =NEW(item,z,z,
1);
}
}
else
{
g_stack[g_index].parent = p;
g_index +=1;
x = x->right;
if (x ==
z)
{
p->right =NEW(item,z,z,
1);
}
}
}
PBSTNode link =
NULL;
int i =
g_index -1;
for (;i >=
0;--i)
{
link =g_stack[i].parent;
if (v <
key(link->data))
{
link =rotR(link);
if (i-1 >=
0)
{
g_stack[i -
1].parent->right = link;
}
}
else
{
link =rotL(link);
if (i-1 >=
0)
{
g_stack[i -
1].parent->left = link;
}
}
}
for (i =
g_index-1;i >=0; --i)
{
g_stack[i].parent =NULL;
}
g_index =
0;
header = link;
}
相关文章推荐
- 二叉搜索树(BST)递归与非递归的插入、删除、查找的实现
- 非递归实现二叉查找树插入操作
- 使用指针数组实现bst插入和查找操作
- [数据结构]10.2实现binary search tree的查找和插入操作,用非递归的方法实现
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 实现StringGrid的删除,插入,排序行操作(基本操作啦)
- 用java实现的迭代和递归插入排序
- 使用bboss persistent框架实现数据库的插入操作
- 用递归实现字符串操作标准库函数
- Qt创建那个XML文档,并且对它实现查找,更新,插入等操作
- 利用递归轻松实现TreeView控件中子节点的全选操作[VB]
- Gridview控件中,实现插入新记录的操作(footer)
- c语言实现单链表的操作:创建,删除,插入,反转, 排序等
- 2011 -09-01-实现递归列目录的操作
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- MFC 运用CFileFind 类 递归实现文件夹的 复制 (MFC 文件操作 二)
- 学习算法导论-插入查询(递归实现)
- 二叉树实现(包括遍历等各种操作,递归与非递归)
- MFC 运用CFileFind 类 递归实现文件夹的 复制 (MFC 文件操作 二)
- vb 利用ADO.Net实现数据库的连接,修改,删除,插入操作