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

原创 2012年03月26日 09:29:08

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

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


顺序存储:这种适合于比较完全的二叉树。子节点则为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);
}


相关文章推荐

基于三叉链表存储结构的二叉树的不用栈的非递归遍历

三叉链表和二叉链表的不同在于,三叉链表多了一个parent指针域,指向双亲节点。便于访问双亲节点。 有了这个parent指针域,我们就能实现不用栈的非递归遍历二叉树。 现在,让我们来看看基于三叉链...

二叉树的三叉链表实现(c语言)

  • 2009年05月18日 22:43
  • 200KB
  • 下载

三叉链表实现二叉树

VS2005可以运行通过。程序参考了许多大牛的总结,因能力有限,如有问题,请各位大牛指正。 二叉树采用三叉链表,实现了二叉树的构造、遍历、深度、宽度、结点个数、叶子个数 以及 结点的交换、层次、祖先...

数据结构之---C语言实现二叉树的三叉链表存储表示

数据结构之---C语言实现二叉树的三叉链表存储表示

二叉树的三叉链表存储及其Java实现

二叉树的三叉链表存储及其Java实现 http://www.bkjia.com/Javabc/853416.html 三叉链表存储的思想是让每个节点持有三个引用parent、left、righ...

二叉查找树实现类——二叉链表

今晚头还是晕晕的,就随便写个数据结构来提神。 就选了二叉查找树吧,老规矩,直接参考了Wiki上面的内容。 二叉查找树的特性: 二叉查找树(Binary Search Tree),或者是一...
  • BetaBin
  • BetaBin
  • 2012年03月26日 21:44
  • 1197

Java基础 - 二叉树的三叉链表存储

三叉链表存储的思想是让每个节点不仅“记住”它的左、右两个子节点,还要“记住”它的父节点,因此需要为每个节点增加left、right和parent 三个指针,分别引用该节点的左、右两个子节点和父节点。...

二叉树采用三叉链表的存储结构,不借助栈的非递归中序遍历

/********** 【题目】二叉树采用三叉链表的存储结构,试编写 不借助栈的非递归中序遍历算法。 三叉链表类型定义: typedef struct TriTNode { TElemType d...

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

(一个人感冒咳嗽不悲剧,悲剧的是全家都感冒咳嗽,没人做事……忽冷忽热的天气得注意保暖) 首先吧,关于AVL树的知识,还是老规矩,Wiki下。 “在计算机科学中,AVL树是最先发明的自平衡二叉查找树...
  • BetaBin
  • BetaBin
  • 2012年03月30日 10:44
  • 1130

二叉树的三叉链表存储结构

// c6-6.h 二叉树的三叉链表存储结构(见图6.15) typedef struct BiTPNode { TElemType data; BiTPNode *parent,*lchild,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树实现类 —— 三叉链表实现
举报原因:
原因补充:

(最多只允许输入30个字)