【数据结构】51_树的定义与操作

树的定义

  • 树是一种非线性数据结构
  • 树是由 n(n>=0) 个节点组成的有限集合

    • 如果 n = 0, 称为空树;
    • 如果 n > 0, 则:

      • 有一个特定的称之为根(root)的节点
      • 根节点只有直接后继,但没有直接前驱
      • 除根以外的其它节点划分为m(m>=0)个互不相交的有限集合T0,T1,...,Tm-1,每个集合又是一颗树,并且称之为根的子树(sub tree)

树的示例

【数据结构】51_树的定义与操作_第1张图片

树中度的概念

  • 树的节点包含一个数据及若干指向子树的分支
  • 节点拥有的子树数目称为节点的度

    • 度为 0 的节点称为叶节点
    • 度不为 0 的节点称为分支节点
  • 树的度定义为所有节点中度的最大值

树的度的示例

度为 3 的树

【数据结构】51_树的定义与操作_第2张图片

树中的前驱和后继

  • 节点的直接后继称为该节点的孩子

    • 相应的,该节点称为孩子的双亲
  • 节点的孩子的孩子的......称为该节点的子孙

    • 相应的,该节点称为子孙的祖先
  • 同一个双亲的孩子之间互称为兄弟

【数据结构】51_树的定义与操作_第3张图片

数中的节点层次

  • 根为第 1 层
  • 根的孩子为第 2 层
  • ...

【数据结构】51_树的定义与操作_第4张图片

树中节点的最大层次称为树的深度或高度

树的有序性

如果树中节点的各子树从左到右是有次序的,子树之间不能互换位置,则称为该树为有序树,否则为无序树。

【数据结构】51_树的定义与操作_第5张图片

森林的概念

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

【数据结构】51_树的定义与操作_第6张图片

树的操作

  • 将元素插入数中
  • 将元素从树中删除
  • 在树中查找元素
  • 获取树的节点数
  • 获取数的高度
  • 获取数的度
  • 清空数的元素

。。。

树的数据结构

数在程序中表现为一种特殊的数据类型
template 
class Tree : public Object
{
public:
    Tree() { m_root = NULL; }
    virtual bool insert(TreeNode *node) = 0;
    virtual bool insert(const T &value, TreeNode *parent) = 0;
    virtual SharedPointer> remove(const T &value) = 0;
    virtual SharedPointer> remove(TreeNode *node) = 0;
    virtual TreeNode* find(const T &value) const = 0;
    virtual TreeNode* find(TreeNode *node) const = 0;
    virtual TreeNode* root() const = 0;
    virtual int degree() const = 0;
    virtual int count() const = 0;
    virtual int height() const = 0;
    virtual void clear() = 0;
    
protected:
    TreeNode *m_root;
};

节点的数据结构

树中的节点也表现为一种特殊的数据类型
template 
class TreeNode : public Object
{
public:
    T value;
    TreeNode *parent;
    
    TreeNode()
    {
        parent = NULL;
    }
    
    virtual ~TreeNode() = 0;
};

树与节点的类关系

【数据结构】51_树的定义与操作_第7张图片

编程实验:树与节点抽象类的创建

文件:TreeNode.h

#ifndef TREENODE_H
#define TREENODE_H

#include "Object.h"

namespace DTLib
{

template 
class TreeNode : public Object
{
public:
    T value;
    TreeNode *parent = nullptr;

    virtual ~TreeNode() = 0;
};

template 
TreeNode::~TreeNode()
{

}

}

#endif // TREENODE_H

文件:Tree.h

#ifndef TREE_H
#define TREE_H

#include "Object.h"
#include "TreeNode.h"
#include "SharedPointer.h"

namespace DTLib
{

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

protected:
    TreeNode *m_root = nullptr;
};

}

#endif // TREE_H

小结

  • 树是一种特殊的数据结构
  • 节点拥有唯一前驱(父节点)和若干后继(子节点)
  • 树的节点包含一个数据及若干指向其它节点的指针
  • 树与节点在程序中表现为特殊的数据类型

以上内容整理于狄泰软件学院系列课程,请大家保护原创!

你可能感兴趣的:(c++)