数据结构 笔记:树的定义与操作

树是一种非线性的数据结构

树是由n(n>=0)个结点组成的有限集合

-如果 n = 0,成为空树;

-如果n > 0,则:

·有一个特定的称之为根(root)的结点

·根据点只有直接后继,但没有直接前驱

·除根以外的其他结点划分为m(m>=0)个互补相交的有限集合T0,T1,...,Tm-1,

每个集合又是一棵树,并称之为根的子树(sub tree)

树中度的概念

-树的结点包含一个数据及若干指向子树的分支

-结点拥有的子树数目称为结点的度

·度为0的结点成为叶结点

·度不为0的结点成为分支结点

-树的度定义为所有结点中度的最大值

树中的前驱和后继

-结点的直接后继称为该结点的孩子

·相应的,该结点称为孩子的双亲

-结点的孩子的孩子的.......称为该结点的子孙

·相应的,该结点称为子孙的祖先

-同一个双亲的孩子之间互称兄弟

树中结点的层次

树的有序性

-如果树中结点的各个树从左向右是有次序的,子树间不能互换位置,则称该树为有序树,负责为无序树。

森林的概念

-森林是由n(n>=0)颗互不相交的树组成的结合

树的一些常用操作

-将元素插入树中

-将元素从树中删除

-获取树的结点树

-获取树的高度

-获取树的度

-清空树中的元素

-。。。

树在程序中表现为一种特殊的数据类型

template <typename T>
class Tree : public Object
{
protected:
    TreeNode<T>* m_root;
public:
    Tree() {m_root = NULL ;}
    virtual bool insert(TreeNode<T>* node) = 0;
    virtual bool insert(const T& value,TreeNode<T>* parent) = 0;
    virtual SharedPointer<Tree<T>>remove(const T& value) = 0;
    virtual SharedPointer<Tree<T>>remove(TreeNode<T>* node) = 0;
    virtual TreeNode<T>* find(const T& value) const = 0;
    virtual TreeNode<T>* find(TreeNode<T>* node)const = 0;
    virtual TreeNode<T>* root() const = 0;
    virtual int degree() const = 0;
    virtual int count() const = 0;
    virtual int height() const = 0;
    virtual void clear() = 0;
};

树中结点也表现为一种特殊的数据类型

template<typename T>
class TreeNode : public Object
{
public:
    T value;
    TreeNode<T>* parent;

    TreeNode()
    {
        parent = NULL;
    }

    virtual ~TreeNode() = 0;
};

总结:

-树是一种非线性的数据结构

-结点拥有唯一的前驱(父结点)和若干后继(子结点)

-树的结点包含一个数据及若干指其他结点的指针

-树与结点在程序中表现为特殊的数据类型

猜你喜欢

转载自blog.csdn.net/qq_29962483/article/details/83986571