设为首页 加入收藏

TOP

一步一步写算法(之排序二叉树线索化) (一)
2014-11-23 23:36:40 来源: 作者: 【 】 浏览:47
Tags:步一步 算法 排序 线索

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作二叉树插入二叉树删除1删除2删除3。但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么办呢?按照现在的结构,我们只能一个一个数据查找验证,首先看看在不在排序二叉树中,如果在那么删除;如果没有这个数据,那么继续查找。那么有没有方法,可以保存当前节点的下一个节点是什么呢?这样就不再需要进行无谓的查找了。其实这样的方法是存在的,那就是在排序二叉树中添加向前向后双向节点。

现在数据结构定义如下:

typedef struct _TREE_NODE

{

int data;

struct _TREE_NODE* prev;

struct _TREE_NODE* next;

struct _TREE_NODE* left;

struct _TREE_NODE* right;

}TREE_NODE;

typedef struct _TREE_NODE

{

int data;

struct _TREE_NODE* prev;

struct _TREE_NODE* next;

struct _TREE_NODE* left;

struct _TREE_NODE* right;

}TREE_NODE; 拿节点的添加来说,我们可能需要添加prev、next的处理步骤。

void set_link_for_insert(TREE_NODE* pParent, TREE_NODE* pNode)

{

if(NULL == pParent || NULL == pNode)

return;

if(pNode = pParent->left){

pNode->prev = pParent->prev;

if(pParent->prev)

pParent->prev->next = pNode;

pNode->next = pParent;

pParent->prev = pNode;

}else{

pNode->next = pParent->next;

if(pParent->next)

pParent->next->prev = pNode;

pNode->prev = pParent;

pParent->next = pNode;

}

return;

}

STATUS add_node_into_tree(TREE_NODE** ppTreeNode, int data)

{

TREE_NODE* pHead;

TREE_NODE* pNode;

if(NULL == ppTreeNode)

return FALSE;

if(NULL == *ppTreeNode){

*ppTreeNode = create_new_node(data);

return TRUE;

}

if(NULL != find_data_in_tree(*ppTreeNode, data))

return FALSE;

pHead = *ppTreeNode;

while(1){

if(data < pHead->data){

if(pHead->left){

pHead = pHead->left;

}else{

pNode = create_new_node(data);

pHead->left = pNode;

break;

}

}else{

if(pHead->right){

pHead = pHead->right;

}else{

pNode = create_new_node(data);

pHead->right = pNode;

break;

}

}

}

set_link_for_insert(pHead, pNode);

return TRUE;

}

void set_link_for_insert(TREE_NODE* pParent, TREE_NODE* pNode)

{

if(NULL == pParent || NULL == pNode)

return;

if(pNode = pParent->left){

pNode->prev = pParent->prev;

if(pParent->prev)

pParent->prev->next = pNode;

pNode->next = pParent;

pParent->prev = pNode;

}else{

pNode->next = pParent->next;

if(pParent->next)

pParent->next->prev = pNode;

pNode->prev = pParent;

pParent->next = pNode;

}

return;

}

STATUS add_node_into_tree(TREE_NODE** ppTreeNode, int data)

{

TREE_NODE* pHead;

TREE_NODE* pNode;

if(NULL == ppTreeNode)

return FALSE;

if(NULL == *ppTreeNode){

*ppTreeNode = create_new_node(data);

return TRUE;

}

if(NULL != find_data_in_tree(*ppTreeNode, data))

return FALSE;

pHead =

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言学习笔记(二)--数据类型、.. 下一篇一步一步写算法(之hash表)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: