[原创]码图并茂红黑树
来了15pb怎么久,转眼就快毕业了,既然准备找工作听说最好发点帖子,那么第一篇就拿数据结构开刀吧!
当初自己想写红黑树时候参考了网上的代码,最后发现还是<<算法导论>中的伪代码最好懂,所以代码完全按照<<算法导论>>伪代码来编写,方便对照<<算法导论>>来学习红黑树.
写红黑树的文章很多,这篇文章和其他写红黑树的区别:
- 完全按照<<算法导论>>中伪代码逻辑编写,网上很多代码都经历过优化或者加工,对照<<算法导论>>的伪代码看着很难受
-
后面提供插入和删除调整树的图,对着代码单步调试更好理解
直接上代码
RBTree.h#pragma once
//红黑树
class RBTree
{
private:
typedef enum
{
E_TREE_BLACK,
E_TREE_RED,
E_TREE_COLOR_MAX
}ETreeColor;
const static char *s_pszColor[E_TREE_COLOR_MAX];
typedef struct __TreeNode
{
__TreeNode* pParent;
__TreeNode* pLeft;
__TreeNode* pRight;
ETreeColor eColor;
int nValue;
}TreeNode, *PTreeNode;
public:
RBTree();
~RBTree();
//插入数据
void InsertData(int nValue); //插入数据
bool Empty(); //判空
bool GetMax(PTreeNode pNode, int &nMax); // 获取最大值
bool GetMin(PTreeNode pNode, int &nMin); //获取最小值
void DeleteElement(int nDelete); //删除指定的元素
bool FindElement(int nFindValue); //查找数据,如果查找到返回true,否则返回false
void BreadthEnum(); //广度遍历
private:
void InsertFixUp(PTreeNode pInsertNode); //插入pInsertNode点后调整红黑树
void DeleteFixUp(PTreeNode pFixNode); //删除后重新调整
void SingleL(PTreeNode &pNode, PTreeNode &newTop); //左旋转,并且返回新的顶点
void SingleR(PTreeNode &pNode, PTreeNode &newTop); //右旋转
void ReplaceParent(PTreeNode pBeReplacedNode, PTreeNode pReplaceNode); //把pReplaceNode的父节点修改为pBeReplacedNode的
bool GetMinNode(PTreeNode pNode, PTreeNode &pMinNode);//获取最小的节点
private:
PTreeNode m_pRoot; //根节点指针
PTreeNode m_pNil; //空节点
};
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
