树——树的定义与操作

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,树与结点在程序中表现为特殊的数据结构类型;

posted @ 2019-05-25 22:50  子宇24  阅读(517)  评论(0编辑  收藏  举报