1,数据结构里面的非线性结构;
1,树;
2,树是一种非线性的数据结构;
3,树是由 n(n >= 0) 个结点组成的有限集合:
1,如果 n = 0,称为空树;
2,如果 n > 0,则:
1,有一个特定的称之为根(root)的结点;
2,根结点只有直接后继,但没有直接前驱;
3,除根以外的其它结点划分为 m(m >= 0) 个互不相交的有限集合 T0, T1, ..., Tm-1,每个集合又是一棵树,并且称之为根的子树(sub tree);
4,树是递归定义的,树自身也是递归构成的,示例:
5,树中度的概念:
1,树的结点包含一个数据及若干指向子树的分支;
1,C++ 中指向结点的指针;
2,结点拥有的子树数目称为结点的度;
1,度为 0 的结点称为叶结点;
2,度不为 0 的结点称为分支结点;
3,树的度定义为所有结点中度的最大值;
6,树中的前驱和后继:
1,结点的直接后继称为该结点的孩子;
1,相应的,该结点称为孩子的双亲;
2,结点的孩子的孩子的 ... 称为该结点的子孙;
1,相应的,该结点称为子孙的祖先;
3,同一个双亲的孩子之间互称兄弟;
7,树中结点的层次:
1,根为第 1 层;
2,根的孩子为第 2 层;
3,...;
8,树中结点的最大层次称为树的深度或高度;
9,树的有序性:
1,如果树中结点的各子树从左向右是有次序的,子树间不能互换位置,则称该树为有序树,否则为无序树;
10,森林的概念:
1,森林是由 n(n >= 0) 棵互不相交的树组成的集合;
1,代码中定义了一个数组,这个数组里面的每一个元素都是一棵树,这个数组就构成了一个森林;
11,树中的一些常用操作:
1,将元素插入树中;
2,将元素从树中删除;
3,查找树的结点;
4,获取树的结点树;
5,获取树的高度;
6,获取树的度;
7,清空树中的元素;
8,...;
9,抽象树中不用析构函数,因为没有申请对象;
12,树在程序中表现为一种特殊的数据类型:
13,树中的结点也表现为一种特殊的数据类型:
1,一般的不会要求树中有指向树结点的指针,理论上没有问题,但是从实践角度来看,在工程上加上这个指向父结点的指针非常有帮助;
2,结点是抽象类,被继承;
14,树与结点的类关系:
1,树使用结点;
15,树结点与树抽象类的创建,从第四十五课到第六十四课内容:
1,抽象树结点 TreeNode 的创建:
1 #ifndef TREENODE_H 2 #define TREENODE_H 3 4 #include "Object.h" 5 6 namespace DTLib 7 { 8 9 template < typename T > 10 class TreeNode : public Object 11 { 12 protected: // 从两个子类中重构而来;减少代码冗余 13 bool m_flag; // 结点是否申请自堆空间的标志 14 15 TreeNode(const TreeNode<T>&); 16 TreeNode<T>& operator = (const TreeNode<T>&); // 也不能够进行复制 17 18 void* operator new(unsigned int size) throw() // new 不能够在外部调用了,统一路径 19 { 20 return Object::operator new(size); 21 } 22 23 public: 24 T value; // 存储数据 25 26 TreeNode<T>* parent; //每个结点包含指向父结点的指针,向上是线性数据结构(链表) 27 28 TreeNode() 29 { 30 m_flag = false; // 构造函数将堆空间申请标志置为 false; 重构而来 31 parent = NULL; 32 } 33 34 bool flag() // 堆空间的标志; 重构而来 35 { 36 return m_flag; 37 } 38 39 virtual ~TreeNode() = 0; // 虽然析构函数已经是纯虚函数,但是还是要提供空的函数体 40 }; 41 42 template <typename T> 43 TreeNode<T>::~TreeNode() 44 { 45 46 } 47 48 } 49 #endif // TREENODE_H
2,抽象树 Tree 的创建:
1 #ifndef TREE_H 2 #define TREE_H 3 4 #include "TreeNode.h" 5 #include "SharedPointer.h" 6 7 namespace DTLib 8 { 9 10 /* 树是一种容器类型,可以放入东西,也可以删除东西 */ 11 template <typename T> 12 class Tree : public Object 13 { 14 protected: 15 TreeNode<T>* m_root; // 指向树的根结点的指针; 16 17 /* 禁止两棵树之间进行复制 */ 18 Tree(const Tree<T>&); 19 Tree<T>& operator = (const Tree<T>&); 20 21 public: 22 Tree() { m_root = NULL;} 23 24 virtual bool insert(TreeNode<T>* node) = 0; 25 virtual bool insert(const T& value, TreeNode<T>* parent) = 0; 26 27 virtual SharedPointer< Tree<T> > remove(const T& value) = 0; // 删除的是结点,之后将结点代表的子树删除,但不销毁然后将子树返回,以需求对子树操作,由智能指针指向 28 virtual SharedPointer< Tree<T> > remove(TreeNode<T>* node) = 0; 29 30 virtual TreeNode<T>* find(const T& value) const = 0; 31 virtual TreeNode<T>* find(TreeNode<T>* node) const = 0; 32 33 virtual TreeNode<T>* root() const = 0; 34 35 virtual int degree() const = 0; 36 virtual int count() const = 0; 37 virtual int height() const = 0; 38 39 virtual void clear() = 0; 40 41 virtual bool begin() = 0; 42 virtual bool end() = 0; 43 virtual bool next() = 0; 44 virtual T current() = 0; 45 }; 46 } 47 #endif // TREE_H
16,小结:
1,树是一种非线性的数据结构;
2,结点拥有唯一前驱(父结点)和若干后继(子结点);
3,树的结点包含一个数据及若干指其它结点的指针;
4,树与结点在程序中表现为特殊的数据结构类型;