回复: C++数据结构学习:二叉树(1)
节点结构
数据域、左指针、右指针肯定是必须的。除非很少用到节点的双亲,或者是资源紧张,建议附加一个双亲指针,这将会给很多算法带来方便,尤其是在这个“空间换时间”的时代。
template
structBTNode
{
BTNode(Tdata=T(),BTNode*left=NULL,BTNode*right=NULL,BTNode*parent=NULL)
:data(data),left(left),right(right),parent(parent){}
BTNode*left,*right,*parent;
Tdata;
};
基本的二叉树类
template
classBTree
{
public:
BTree(BTNode*root=NULL):root(root){}
~BTree(){MakeEmpty();}
voidMakeEmpty(){destroy(root);root=NULL;}
protected:
BTNode*root;
private:
voiddestroy(BTNode*p)
{
if(p)
{
destroy(p->left);
destroy(p->right);
deletep;
}
}
}
二叉树的遍历
基本上有4种遍历方法,先、中、后根,逐层。当初我对这个很迷惑,搞这么多干什么?到了后面才明白,这是不同的应用需要的。例如,判断两个二叉树是否相等,只要子树根节点不同,那么就不等,显然这时要用先序遍历;而删除二叉树,必须先删除左右子树,然后才能删除根节点,这时就要用后序遍历。
实际上,搞这么多遍历方法,根本原因是在内存中储存的树是非线性结构。对于用数组储存的二叉树,这些名目繁多的方法都是没有必要的。利用C++的封装和重载特性,这些遍历方法能很清晰的表达。