- 注册时间
- 2009-10-1
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 315
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
我照着<算法导论>上关于红黑树删除操作的伪代码编写了一个红黑树删除操作,但是测试的时候发现一直出现指针为空操作的异常,算法是完全照着书上的,不知道是书上的算法有问题还是怎么回事.
以下是红黑树的相关代码:- #define and &&
- #define or ||
- #define NIL NULL
- class Node
- {
- public:
- int key;
- Node* left; //左孩子
- Node* right; //右孩子
- Node* parent; //父节点
- // int item;
- int color;
- Node()
- {
- left=NIL;
- right=NIL;
- parent=NIL;
- color=-1;
- }
- Node(int key)
- {
- this->key=key;
- left=NIL;
- right=NIL;
- parent=NIL;
- color=-1;
- }
- };
- class RedBlackTree
- {
- public:
- Node *root;
- Node* Successor(Node* node);
- void Insert(Node* node);
- void LeftRotate(Node* node);
- void RightRotate(Node* node);
- Node* Delete(Node* node);
- void InsertFixUp(Node* node);
- void DeleteFixUp(Node *node);
- Node* Search(int key);
- int getNodeNum()
- {
- return totalNodes;
- }
- RedBlackTree()
- {
- root=NIL;
- }
- };
复制代码 树的相关操作测试函数:- void main()
- {
- Node *node[100];
- Node *x;
- RedBlackTree t;
- //BinarySearchTree t;
-
- int key[]={5,3,8,2,4,7,9,1,6,10};
- int i,j,k;
- int n=sizeof(key)/sizeof(*key);
-
- for(i=0;i<n;i++)
- {
- node[i]=new Node(key[i]);
- t.Insert(node[i]);
-
- }
- printf("root->key=%d\n",t.root->key);
- printf("\n");//i=0;
- for(i=0;i<n;i++)
- {
- x=t.Delete(t.Search(i+1));
- printf("delete key=%d\n",x->key);
- printf("root->key=%d\n",t.root->key);
- printf("\n\n");
- }
- }
复制代码 每次运行循环进行了两次就出现了异常,通过Debug发现在第2轮循环DeleteFixUp操作中node为空指针,由此出现了异常.以上的DeleteFixUp是照着书上编的, 估计伪代码也有问题, 不知道如何改正 |
|