欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]码图并茂红黑树

[原创]码图并茂红黑树

    来了15pb怎么久,转眼就快毕业了,既然准备找工作听说最好发点帖子,那么第一篇就拿数据结构开刀吧!
    当初自己想写红黑树时候参考了网上的代码,最后发现还是<<算法导论>中的伪代码最好懂,所以代码完全按照<<算法导论>>伪代码来编写,方便对照<<算法导论>>来学习红黑树.

     写红黑树的文章很多,这篇文章和其他写红黑树的区别:

  1.      完全按照<<算法导论>>中伪代码逻辑编写,网上很多代码都经历过优化或者加工,对照<<算法导论>>的伪代码看着很难受
  2.     后面提供插入和删除调整树的图,对着代码单步调试更好理解

    直接上代码

      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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功