关于二叉树有感
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;
};
其实这样声明会导致挺大结构性开销的,因为叶子节点的左右孩子依然占据空间,不过既然是第一次写,也就不管了。
这是建立,因为太久没有碰C++的模板,然后想试一下,所以就用模板写了,不过写的过程中发现自己原来有挺多东西已经忘记了,所以呀熟能生巧,生疏了就忘记。建立的时候我把元素值大的放在右边,小的放在左边,相等的就抛弃。写这个的时候没有什么难的,我觉得写基于数组的二叉树比较难。
2、基于数组的二叉查找树
在编写过程中基本上和基于指针的二叉查找树没什么区别。不过如果按照算法分析就挺大区别了,主要在于消除结构性浪费,而且方便查找,插入删去。不过建立时我觉得比基于指针的要难,因为要判断左右孩子是否为空,在数组中,以我现在的能力只能给她设置一个特殊值来判断,除此外就没有其他方法了,所以我初始化数组时用-1为空的标志。如果初始化数组可以这么做memset( Array, n, size*sizeof(Array)), 不过有一点要注意,我当时用Arrary = new int[size]来申请空间,然后memset( Array ,n , sizeof(Array))却发现只有Array[0]是我设定的值,其余元素都是统一的乱值,所以我在想是否由于sizeof(Array)中,Array是指针所以得出来的值只是一个元素的大小呢?而非整个数组的大小……
当初判断左右孩子是否为空时我还想了其他两种方法,不过都被舍弃了,第一种是用一个值记录乱值,然后一次作为判断左右孩子是否为空的标志,不过因为是随机值所以不好,out.第二种方法是用一些转义字符,不过由于我用整型,这会自动转成整数,所以……
总的来说,今天收获颇大的
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.第二种方法是用一些转义字符,不过由于我用整型,这会自动转成整数,所以……
总的来说,今天收获颇大的
相关文章推荐
- 数据结构——关于二叉树
- 关于Android的一些概念有感
- java 里关于二叉树排序的问题
- 关于二叉树的一道面试题
- 关于记笔记的一些总结与思考(读Tcpip卷一有感)
- 上算法设计课-----关于并行计算有感
- 关于hadoop使用LZO压缩模式有感
- 关于二叉树指针和引用的体会
- GCT学习有感----关于交流沟通
- 外籍团队工作有感:3、关于开发工具
- 关于二叉树的层次遍历的花样(c++实现)
- 观某篇博文后有感,关于程序员所处阶段划分
- 关于二叉树的一些题
- 关于二叉树的实现
- 关于二叉树的按层打印
- 关于分层遍历二叉树
- 关于二叉树与树(森林)的知识点详解
- 关于二叉树的二叉链表存储结构的两道题目
- 关于各种二叉树
- GCT学习有感----关于交流沟通