关闭

二叉树实现类 —— 三叉链表实现

标签: classnullinsert数据结构delete算法
2464人阅读 评论(0) 收藏 举报
分类:

这天气都能惹上感冒+咳嗽,这幸运。

话说回来,复习数据结构,二叉树算是第一个要看的,比较简单,又容易理解。实现方式有很多,大概如下:


顺序存储:这种适合于比较完全的二叉树。子节点则为2i + 1和2i + 2,父节点则为floor((i - 1)/ 2)。

二叉链表:也就是链表实现,三个属性,值,左子节点指针,右子节点指针。这个空间算是节约,不过找父节点不好找。

三叉链表:相对于二叉链表,多了父亲节点指针。可以更好的实现节点的访问,不过算法相对也会复杂点。


其实还有其它变形,就不先说。树的遍历可以分为深搜和广搜。深搜就是常见的前序、中序、后序。广搜则是需要借住队列的实现。每访问一个节点则把其子节点都扔进队列尾。


废话不多说,三叉链表实现的二叉树类代码如下:

#include <iostream>

using namespace std;

enum Statue
{
	TRUE, FALSE, INSERT_ERROR
};

//二叉树的三叉链表节点结构
template <class NodeType> class BinaryNode 
{
public:
	NodeType value;
	BinaryNode<NodeType> *parent, *lChild, *rChild;

	BinaryNode();
};

template <class NodeType>
BinaryNode<NodeType>::BinaryNode()
{
	parent = NULL;
	lChild = NULL;
	rChild = NULL;
}

//二叉树类,三叉链表实现
template <class NodeType> class BinaryTree
{
public:
	BinaryTree();
	BinaryTree(BinaryNode<NodeType> *root);
	~BinaryTree();
	void DestroyTree();

	void CreatBinaryTree(BinaryNode<NodeType> *root);
	Statue IsEmpty();								//判断是否为空树
	int GetDepth(BinaryNode<NodeType> *node);		//计算从node节点开始的树的层数
	BinaryNode<NodeType>* Find(NodeType value);		//在二叉树中寻找值为value的节点,如有重复则返回中序遍历的第一个。PS:NodeType需要重载==符号
	Statue InsertChild(BinaryNode<NodeType> *nodeParent, BinaryNode<NodeType> *node, BinaryNode<NodeType> *child);	//往node节点位置插入child节点
	void DeleteTree(BinaryNode<NodeType> *node);	//删除node节点为根的树,同时释放其占用内存

private:
	BinaryNode<NodeType> *root;
	BinaryNode<NodeType>* FindFrom(BinaryNode<NodeType> *from, NodeType value);
};

template <class NodeType>
BinaryTree<NodeType>::BinaryTree()
{
	root = NULL;
}

template <class NodeType>
BinaryTree<NodeType>::BinaryTree(BinaryNode<NodeType> *root)
{
	CreatBinaryTree(root);
}

template <class NodeType>
void BinaryTree<NodeType>::DestroyTree()
{
	DeleteTree(root->lChild);
	DeleteTree(root->rChild);
	delete(root);
}

template <class NodeType>
BinaryTree<NodeType>::~BinaryTree()
{
	DestroyTree();
}

template <class NodeType>
Statue BinaryTree<NodeType>::IsEmpty()
{
	return (NULL == root) ? TRUE : FALSE;
}

template <class NodeType>
int BinaryTree<NodeType>::GetDepth(BinaryNode<NodeType> *node)
{
	if (NULL == node)
	{
		return 0;
	}

	int lDepth, rDepth;
	lDepth = GetDepth(node->lChild);
	rDepth = GetDepth(node->rChild);
	return (lDepth > rDepth) ? lDepth + 1 : rDepth + 1;
}

template <class NodeType>
void BinaryTree<NodeType>::CreatBinaryTree(BinaryNode<NodeType> *node)
{
	if (NULL == node)
	{
		DestroyTree();
		root = NULL;
		return ;
	}

	root = new BinaryNode<NodeType>;
	root->value = node->value;
	InsertChild(root, root->lChild, node->lChild);
	InsertChild(root, root->rChild, node->rChild);
}

template <class NodeType>
Statue BinaryTree<NodeType>::InsertChild(BinaryNode<NodeType> *nodeParent, BinaryNode<NodeType> *node, BinaryNode<NodeType> *child)
{
	Statue result = INSERT_ERROR;

	if (NULL == child)
	{
		DestroyTree();
		result = TRUE;
		return result;
	}

	node = new BinaryNode<NodeType>;
	node->parent = nodeParent;

	result = InsertChild(node, node->lChild, child->lChild);
	if (INSERT_ERROR == result)
	{
		return result;
	}

	result = InsertChild(node, node->rChild, child->rChild);
	return result;
}

template <class NodeType>
void BinaryTree<NodeType>::DeleteTree(BinaryNode<NodeType> *node)
{
	if (NULL = node)
	{
		return;
	}

	DeleteTree(node->lChild);
	DeleteTree(node->rChild);

	free(node);
	node = NULL;
}

template <class NodeType>
BinaryNode<NodeType>* BinaryTree<NodeType>::FindFrom(BinaryNode<NodeType> *from, NodeType value)
{
	if (NULL == from)
	{
		return NULL;
	}

	if (from->value == value)
	{
		return from;
	}

	BinaryNode<NodeType> * findresult;
	findresult = FindFrom(from->lChild, value);

	if (NULL == findresult)
	{
		findresult = FindFrom(from->rChild, value);
	}

	return findresult;
}

template <class NodeType>
BinaryNode<NodeType>* BinaryTree<NodeType>::Find(NodeType value)
{
	return FindFrom(root, value);
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:529758次
    • 积分:5787
    • 等级:
    • 排名:第4630名
    • 原创:125篇
    • 转载:29篇
    • 译文:0篇
    • 评论:26条
    文章分类
    最新评论