之前不知道为甚,每次一打开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;
};
其实这样声明会导致挺大结构性开销的,因为叶子节点的左右孩子依然占据空间,不过既然是第一次写,也就不管了。
这是建立,因为太久没有碰C++的模板,然后想试一下,所以就用模板写了,不过写的过程中发现自己原来有挺多东西已经忘记了,所以呀熟能生巧,生疏了就忘记。建立的时候我把元素值大的放在右边,小的放在左边,相等的就抛弃。写这个的时候没有什么难的,我觉得写基于数组的二叉树比较难。
2、基于数组的二叉查找树
在编写过程中基本上和基于指针的二叉查找树没什么区别。不过如果按照算法分析就挺大区别了,主要在于消除结构性浪费,而且方便查找,插入删去。不过建立时我觉得比基于指针的要难,因为要判断左右孩子是否为空,在数组中,以我现在的能力只能给她设置一个特殊值来判断,除此外就没有其他方法了,所以我初始化数组时用-1为空的标志。如果初始化数组可以这么做memset( Array, n, size*sizeof(Array)), 不过有一点要注意,我当时用Arrary = new int[size]来申请空间,然后memset( Array ,n , sizeof(Array))却发现只有Array[0]是我设定的值,其余元素都是统一的乱值,所以我在想是否由于sizeof(Array)中,Array是指针所以得出来的值只是一个元素的大小呢?而非整个数组的大小……
当初判断左右孩子是否为空时我还想了其他两种方法,不过都被舍弃了,第一种是用一个值记录乱值,然后一次作为判断左右孩子是否为空的标志,不过因为是随机值所以不好,out.第二种方法是用一些转义字符,不过由于我用整型,这会自动转成整数,所以……
总的来说,今天收获颇大的