求平衡二叉树删除节点的算法

zoohoo 2006-06-29 08:40:30
需要使用平衡因子,验证通过立马给分。
...全文
755 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoohoo 2006-07-01
  • 打赏
  • 举报
回复
非常感谢二位,第一位我要的是c的source,所以不能给你更多的分了。
winks 2006-06-30
  • 打赏
  • 举报
回复
高人啊~~~
  • 打赏
  • 举报
回复
I prefer to introduce this to u:
http://www.stanford.edu/~blp/avl/

from stanford univ,plus all documentations.

enjoy coding!
jixingzhong 2006-06-29
  • 打赏
  • 举报
回复
file treeline.cc

/*删除成员函数的实现, 其他 略*/

int TBinTreeLink::remove (TTreeLineNode *node)
{
TTreeLineNode *node_parent;

if (!node) return FALSE;

node_parent = node->parent;

// modify link
if (node == head) {
head = node->next;
if (head) {
head->prev = NULL;
}
else {
head = tail = NULL;
}
}
else if (node == tail) {
tail = node->prev;
tail->next = NULL;
}
else {
node->prev->next = node->next;
node->next->prev = node->prev;
}

// when node is a leaf
if (!node->right && !node->left) {
if (node->parent) {
if (node->parent->right == node) {
node->parent->right = NULL;
node->parent->balance += 1;
}
else {
node->parent->left = NULL;
node->parent->balance -= 1;
}
}
else {
root = NULL;
}
}
// only have one child
else if ((node->left && !node->right) || (!node->left && node->right)){
if (node->parent) {
TTreeLineNode *used_node = NULL;

used_node = node->left ? node->left : node->right;
used_node->parent = node->parent;

if (node->parent->left == node) { // node is left child
node->parent->left = used_node;
node->parent->balance -= 1;
}
else { // node is right child
node->parent->right = used_node;
node->parent->balance += 1;
}
}
else {
root = (node->left ? node->left : node->right);

root->parent = NULL;
}
}
// have two children
else {
TTreeLineNode *prev_node;
// not thinking balance value
// prev_node in left child tree
prev_node = node->prev; // prev_node is the largest node in left child tree
prev_node->balance = node->balance;

node_parent = prev_node; //

if (node_parent)
node_parent->balance += 1;

if (prev_node->parent == node) {
prev_node->right = node->right;
node->right->parent = prev_node; //
if (node->parent == NULL) {// node is root!!
root = prev_node;
root->parent = NULL;
}
else { // node is not root
(node->parent->left == node) ?
(node->parent->left = prev_node) : (node->parent->right = prev_node);
prev_node->parent = node->parent;
}
}
else {
prev_node->parent->right = prev_node->left;
if (prev_node->left) {
prev_node->left->parent = prev_node->parent; //
}
prev_node->left = node->left;
node->left->parent = prev_node; //

prev_node->right = node->right;
node->right->parent = prev_node; //

if (node->parent == NULL) {
root = prev_node;
prev_node->parent = NULL;
}
else {
(node->parent->left == node) ?
(node->parent->left = prev_node) : (node->parent->right = prev_node);
prev_node->parent = node->parent;
}
}
}

delete node;
node_balance (node_parent, false);
return TL_SUCCESS;
}
jixingzhong 2006-06-29
  • 打赏
  • 举报
回复
通用二叉平衡排序树的实现类:
file treeline.h

#ifndef TREELINE_H__
#define TREELINE_H__

//
////////////////////////////////////////////////////////////////////////////////
// Bin Tree and order Link <> Tool
// Copy Right , Written By Gan Huaxin, 2001-07-19
// Created in 2001-07-19
// modeified in 2001-07-21
// Thanks for PanXF and YuHang @ FNST
////////////////////////////////////////////////////////////////////////////////
//

/*
#ifndef DEBUG_TREE
#define DEBUG_TREE
#endif
*/

#define TL_SUCCESS 1
#define TL_FREE_DATA_ERROR -1
#define TL_COMPARE_ERROR -2
#define TL_SEARCH_ERROR -3
#define TL_UNCOMMON_POINTER -4
#define TL_NULL_POINTER -5
#define TL_NO_MEM -6

#define COMPARE_BIG 1
#define COMPARE_EQUAL 0
#define COMPARE_LESS -1

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#ifndef NULL
#define NULL 0
#endif

struct TTreeLineNode;
class TBinTreeLink;

typedef int (*CompareFunc) (const void* data_a, const void* data_b);
// typedef int (*SearchFunc) (const void* data);
typedef void (*FreeDataFunc) (void* data);

typedef int BOOL;

//
// function return code
//

struct TTreeLineNode {
void* data; // user data pointer

int balance; // Height (left) - Height (right)

// order link
TTreeLineNode *next;
TTreeLineNode *prev;

// bin tree
TTreeLineNode *left;
TTreeLineNode *right;
TTreeLineNode *parent;
};

class TBinTreeLink {
private :

TTreeLineNode *root; // bin tree root

TTreeLineNode *head; // link head
TTreeLineNode *tail; // link tail

CompareFunc compare_data; // compare data function pointer
// SearchFunc search_data; // serrch data function pointer
FreeDataFunc free_data;// node->data 's free function

bool m_b_func_set;

private :
TTreeLineNode* node_new (void* data);
int node_add (TTreeLineNode** node,
TTreeLineNode** head,
TTreeLineNode** tail,
void* data, BOOL *inserted,
TTreeLineNode** addnode);
int node_destroy (TTreeLineNode* &);
BOOL search (TTreeLineNode* node, void *data,
TTreeLineNode* parent, TTreeLineNode **p);

int release_all ();

// BOOL node_balance (TTreeLineNode*);
BOOL node_balance (TTreeLineNode *a, bool b_add_node);

int node_height (TTreeLineNode* node);
void node_pre_order (TTreeLineNode* node);

public :
TBinTreeLink (); // add 2001-08-27
TBinTreeLink (CompareFunc,
// SearchFunc,
FreeDataFunc);
~TBinTreeLink ();
public :
// add 2001-08-27----------------
void set_compare_func (CompareFunc);
void set_freedata_func (FreeDataFunc);
// end add 2001-08-27----------------
TTreeLineNode* add (void*); // add element to tree link
int remove (TTreeLineNode*); // remove node from tree link
// TTreeLineNode* search (void*); // find special node
int height (); // return the tree height
// int nnodes (); // return the nodes count
void pre_order ();
TTreeLineNode* get_root ();
TTreeLineNode* get_head ();
TTreeLineNode* get_tail ();
TTreeLineNode* find (void* data);
BOOL search (void* data, TTreeLineNode **p);
void report ();
void clear (); // empty this tree!!!
};


#endif

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧