您的位置:首页 > 其它

关于二叉树有感

2010-12-05 19:37 288 查看
之前不知道为甚,每次一打开VS,苦思冥想如何建立二叉树好,翻开Clifford A. Shaffer的《数据结构与算法》发现里面根本就没有讲如何建立,望着右上角,红色的小叉叉居然向我招手,我毫不犹豫地对她进行响应……就这样我这个星期一直没有进步。直到今天,硬着头皮,终于coded两种结构的二叉树。写完后发现很容易,一点儿都不难,当然我只是建立和遍历。下面是分别对两种结构编写过程中一些的感受。



1、基于指针的二叉查找树



template<typename Elem>

class BiNode

{

public:

BiNode(const Elem&, BiNode* pL = NULL, BiNode* pR = NULL);

bool IsLeaf(){ return m_pLeft==NULL && m_pRight==NULL; }

public:

Elem m_Data;

BiNode* m_pLeft;

BiNode* m_pRight;



};

其实这样声明会导致挺大结构性开销的,因为叶子节点的左右孩子依然占据空间,不过既然是第一次写,也就不管了。





//二叉树几点插入
template<typename Elem>
BiNode<Elem>* BiTree<Elem>::AddNode( BiNode<Elem>* root, const Elem& item)//对比①究竟何时需要在模板参数中添加<>
{
	if( root->m_Data == item )//元素相同即返回NULL
		return NULL;
	if( root->m_Data > item )
	{
		if( root->m_pLeft != NULL )
			AddNode( root->m_pLeft, item );
		else
		{
			root->m_pLeft = new BiNode<Elem>( item );
			return root->m_pLeft;
		}
	}
	else
	{
		if( root->m_pRight != NULL )
			AddNode( root->m_pRight, item );
		else
		{
			root->m_pRight = new BiNode<Elem>(item);
			return root->m_pRight;
		}
	}
}
template<typename Elem>
void BiTree<Elem>::InitTree()
{
	Elem item;
	cin>>item;
	m_pRoot = new BiNode<Elem>(item);
	m_NodeCount++;
	while(cin>>item&&item != '/n')
	{
		if( AddNode(m_pRoot, item)!= NULL)
			m_NodeCount++;
	}
}


这是建立,因为太久没有碰C++的模板,然后想试一下,所以就用模板写了,不过写的过程中发现自己原来有挺多东西已经忘记了,所以呀熟能生巧,生疏了就忘记。建立的时候我把元素值大的放在右边,小的放在左边,相等的就抛弃。写这个的时候没有什么难的,我觉得写基于数组的二叉树比较难。







2、基于数组的二叉查找树

在编写过程中基本上和基于指针的二叉查找树没什么区别。不过如果按照算法分析就挺大区别了,主要在于消除结构性浪费,而且方便查找,插入删去。不过建立时我觉得比基于指针的要难,因为要判断左右孩子是否为空,在数组中,以我现在的能力只能给她设置一个特殊值来判断,除此外就没有其他方法了,所以我初始化数组时用-1为空的标志。如果初始化数组可以这么做memset( Array, n, size*sizeof(Array)), 不过有一点要注意,我当时用Arrary = new int[size]来申请空间,然后memset( Array ,n , sizeof(Array))却发现只有Array[0]是我设定的值,其余元素都是统一的乱值,所以我在想是否由于sizeof(Array)中,Array是指针所以得出来的值只是一个元素的大小呢?而非整个数组的大小……

当初判断左右孩子是否为空时我还想了其他两种方法,不过都被舍弃了,第一种是用一个值记录乱值,然后一次作为判断左右孩子是否为空的标志,不过因为是随机值所以不好,out.第二种方法是用一些转义字符,不过由于我用整型,这会自动转成整数,所以……





总的来说,今天收获颇大的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: