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

原创 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);
}


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

数据结构之---C语言实现二叉树的三叉链表存储表示
  • u012965373
  • u012965373
  • 2015年06月16日 09:47
  • 1245

C++ 二叉树(三叉链表存储)不使用栈的非递归算法

题目. 二叉树(三叉链表存储)       二叉树的成员函数,不使用栈的非递归算法(迭代)           1.BinaryTree(T prelist[], int n)以标明空子...
  • Insanity666
  • Insanity666
  • 2016年06月14日 17:06
  • 380

二叉树的三叉存储

形态: 实现: /***************************************8 二叉树的三叉链表存储 by Rowandjj 2014/5/23 *********...
  • RowandJJ
  • RowandJJ
  • 2014年05月24日 12:53
  • 1399

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

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

数据结构5.9二叉树的链式存储-三叉链表

  • 2014年11月19日 10:47
  • 338KB
  • 下载

二叉树:三叉链表

//三叉链表 #ifndef _PBITREE_H #define _PBITREE_H #incldue "BiTree.h" //包含二叉链表的头文件(见上一篇文章)//结点结构体templa...
  • BSSZDS930
  • BSSZDS930
  • 2017年04月20日 18:54
  • 288

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

数据结构之---C语言实现二叉树的三叉链表存储表示
  • u012965373
  • u012965373
  • 2015年06月16日 09:47
  • 1245

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

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

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

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

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

三叉链表存储的思想是让每个节点持有三个引用parent、left、right,分别指向其父节点、左子节点和右子节点。如下图所示: 因此,三叉链表存储的节点大致如: class Node{ ...
  • bruce_6
  • bruce_6
  • 2014年07月29日 09:14
  • 1347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树实现类 —— 三叉链表实现
举报原因:
原因补充:

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