zoukankan      html  css  js  c++  java
  • 树——树的定义与操作

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

  • 相关阅读:
    0325JavaScript
    0322css样式表,选择器
    0320表单
    0313函数
    0312数组
    0311类
    0309笔记整理
    进制转换
    Xcode快捷键大全
    Android LearningNotes
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10924358.html
Copyright © 2011-2022 走看看