C++数据结构:二叉树
二叉树是一种重要的数据结构,与数组、向量、链表都是一种顺序容器,它们提供了按位置访问数据的手段。但是有一个缺点,它们都是按照位置来确定数据,想要通过值来获取数据,只能通过遍历的方式。而二叉树在很大程度上解决了这个缺点,二叉树是按值来保存元素,也按值来访问元素。二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树是递归定义的。二叉树底层数据结构最好采用链表描述。
二叉树在排序、查找、大规模数据索引方面有很多很多应用,二叉树排序是简单算法排序中速度最快的。二叉树是一种获得最佳答案的算法,在实际项目中,用在决策分析的场合比较多。在实际应用中也不一定是二叉树,可以是多叉树
参考:
抽象数据类型 Tree
{
实例
元素集合;如果非空,则集合划分为一个根,一颗左子树和一颗右子树;每一课子树也是二叉树
操作
empty();//
size();//
preOrder(visit);//前序遍历二叉树;visit是访问函数
inOrder(visit);//中序遍历二叉树
postOrder(visit);//后序遍历二叉树
levelOrder(visit);//层次遍历二叉树
};
template<class T>
class Tree
{
public:
virtual ~Tree(){}
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual void preOrder(void(*)(T*)) = 0;
virtual void inOrder(void(*)(T*)) = 0;
virtual void postOrder(void(*)(T*)) = 0;
virtual levelOrder(void(*)(T*)) = 0;
};
主要操作:
确定高度;
确定元素数目;
复制;
显示或打印二叉树;
确定两颗二叉树是否一样;
删除整棵树;
这些操作通过有步骤的遍历二叉树来完成,每个元素仅被访问一次。
二叉树遍历
先序遍历:在第一次遍历到节点时就执行操作,一般只是想遍历执行操作(或输出结果)可选用先序遍历;
中序遍历:对于二分搜索树,中序遍历的操作顺序(或输出结果顺序)是符合从小到大(或从大到小)顺序的,故要遍历输出排序好的结果需要使用中序遍历
后序遍历:后续遍历的特点是执行操作时,肯定已经遍历过该节点的左右子节点,故适用于要进行破坏性操作的情况,比如删除所有节点。判断树中是否存在相同子树时,用的就是后序遍历。对应了“在执行操作时,肯定访问完了左右两个子树"。销毁所有节点,也可以用层次遍历实现。