1 / 12
文档名称:

数据结构学习(C++)——二叉树.doc

格式:doc   页数:12
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据结构学习(C++)——二叉树.doc

上传人:janny 2011/5/18 文件大小:0 KB

下载得到文件列表

数据结构学习(C++)——二叉树.doc

文档介绍

文档介绍:数据结构学习(C++)——二叉树
 happycock(原作)转自CSDN
【1】
这些天参与了CSDN论坛的讨论,改变了我以前的一些看法。回头看我以前的东西,我虽对这本书很不满,但我还是按照它的安排在一点点的写;这样就导致了,我过多的在意书中的偏漏,我写的更多是说“这本书怎样”,而偏离了我写这些的初衷——给正在学习数据结构的人一些帮助。正像我在前面所说的,虽然现有的教科书都不是很合理,但如果仅仅是抱怨这点,那无异于泼妇骂街。虽然本人的水平连初级都够不上,但至少先从我做一点尝试,以后这门课的教授方法必将一点点趋于合理。<?xml:namespace prefix = o ns = "urn:schemas-:office:office" />
因此,后面不在按照书上的次序,将本着“实际应用(算法)决定数据结构”的思想来讲解,常见教科书上有的,基本不再重点叙述(除了重点,例如AVL树的平衡旋转),——因此,在看本文的同时,一定要有一本教科书。这只是一个尝试,希望大家多提宝贵意见。

因为现实世界中存在这“树”这种结构——族谱、等级制度、目录分类等等,而为了研究这类问题,必须能够将树储存,而如何储存将取决于所需要的操作。这里有个问题,是否允许存在空树。有些书认为树都是非空的,因为树表示的是一种现实结构,而0不是自然数;我用过的教科书都是说可以有空树,当然是为了和二叉树统一。这个没有什么原则上的差别,反正就是一种习惯。
二叉树
二叉树可以说是人们假想的一个模型,因此,允许有空的二叉树是无争议的。二叉树是有序的,左边有一个孩子和右边有一个的二叉树是不同的两棵树。做这个规定,是因为人们赋予了左孩子和右孩子不同的意义,在二叉树的各种应用中,你将会清楚的看到。下面只讲解链式结构。看各种讲数据结构的书,你会发现一个有趣的现象:在二叉树这里,基本操作有计算树高、各种遍历,就是没有插入、删除——那树是怎么建立起来的?其实这很好理解,对于非线性的树结构,插入删除操作不在一定的法则规定下,是毫无意义的。因此,只有在具体的应用中,才会有插入删除操作。
节点结构
数据域、左指针、右指针肯定是必须的。除非很少用到节点的双亲,或者是资源紧张,建议附加一个双亲指针,这将会给很多算法带来方便,尤其是在这个“空间换时间”的时代。
template <class T>
struct BTNode
{
BTNode(T data = T(), BTNode<T>* left = NULL, BTNode<T>* right = NULL, BTNode<T>* parent = NULL)
: data(data), left(left), right(right), parent(parent) {}
BTNode<T> *left, *right, *parent;
T data;
};
基本的二叉树类
template <class T>
class BTree
{
public:
BTree(BTNode<T> *root = NULL) : root(root) {}
~BTree() { MakeEmpty(); }
void MakeEmpty() { destroy(root); root = NULL; }
protected:
BTNode<T> *root;
private:
void destroy(BTNode<T>* p)
{
if (p)
{
destroy(p->left);
destroy(p->right);
delete p;
}
}
}
二叉树的遍历
基本上有4种遍历方法,先、中、后根,逐层。当初我对这个很迷惑,搞这么多干什么?到了后面才明白,这是不同的应用需要的。例如,判断两个二叉树是否相等,只要子树根节点不同,那么就不等,显然这时要用先序遍历;而删除二叉树,必须先删除左右子树,然后才能删除根节点,这时就要用后序遍历。
实际上,搞这么多遍历方法,根本原因是在内存中储存的树是非线性结构。对于用数组储存的二叉树,这些名目繁多的方法都是没有必要的。利用C++的封装和重载特性,这些遍历方法能很清晰的表达。
1.         前序遍历
public:
void PreOrder(void (*visit)(T &data) = print) { PreOrder(root, visit); }
private:
void PreOrder(BTNode<T>* p, void (*visit)(T &data))
{
if (p){ visit(p->data); PreOrder(p->left,

最近更新

2026年公司主管年度总结报告 26页

2026年八字属金女宝宝取名喜用字 4页

2023年三亚城市职业学院单招职业适应性测试题.. 39页

2023年上海工程技术大学单招职业适应性考试题.. 39页

2023年上海理工大学单招职业技能考试题库汇编.. 40页

2023年乌海职业技术学院单招职业技能测试题库.. 40页

2023年九江职业技术学院单招职业技能测试题库.. 40页

2023年云南工程职业学院单招职业适应性测试题.. 40页

2023年云南财经职业学院单招职业倾向性考试题.. 40页

2023年仰恩大学单招职业技能考试模拟测试卷及.. 40页

2023年保定理工学院单招职业技能测试题库汇编.. 39页

2023年兰州石化职业技术学院单招职业倾向性测.. 40页

2023年兰州资源环境职业技术大学单招职业适应.. 41页

2023年内蒙古体育职业学院单招职业技能测试题.. 39页

2023年内蒙古电子信息职业技术学院单招职业技.. 39页

2023年内蒙古锡林郭勒盟单招职业适应性考试题.. 40页

2026年兔年5月出生的男孩取什么名字 4页

2023年北海职业学院单招职业倾向性测试题库汇.. 40页

2026年免费宣传策划方案 46页

2023年南充职业技术学院单招职业倾向性考试模.. 41页

2023年南昌工学院单招职业技能考试题库附答案.. 41页

2023年南通职业大学单招职业倾向性测试题库及.. 40页

ZR-003 建设单位法人授权书 1页

2023年四川省凉山州数学中考真题试卷【含答案.. 32页

卫生院医疗质量、医疗安全工作责任书 11页

2025年二手车经理工作总结模板 25页

青岛市电梯安全运行服务规范 20页

急性特发性生理盲点扩大综合征一例 8页

川机管函〔2016〕313号 2页

广东省水利工程编制办法及定额 183页