第52课 树的定义和操作

1. 树的定义

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

 

(2)树是由个结点组成的有限集合。如果n=0,称为空树。如果n>0,则:

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

  ②根结点只有直接后继,但没有直接前驱

  ③除根以外的其它结点划分为m(m≥0)个互不相交的有限集合T0、T1、…Tm-1,每个集合又是一棵树,并且称之为根的子树(sub tree)

(3)森林是由n(n≥0)棵互不相交的树组成的集合

 

2. 树中度的概念

(1)树中的结点包含一个数据及若干指向子树的分支

(2)结点拥有的子树数目称为结点的度(degree)

  ①度为0的结点称为叶结点

  ②度不为0的结点称为分支结点

(3)树的度定义为所有结点中度的最大值

  ①如图c中的A结点度为3,K结点度为0,H结点度为1等

  ②整棵树的度为3

3. 树中的前驱和后继

(1)结点的直接后继称为该结点的孩子。相应的,该结点称为孩子的双亲(如A为B、C、D的双亲,D为H、I、J的双亲。M叶结点无孩子)。

(2)结点的孩子的孩子的…称为该结点的子孙。相应的,该结点称为子孙的祖先。

(3)同一个双亲的孩子之间互称兄弟。(如K和L为兄弟)

4. 树中结点的层次

 

(1)根为第1层,根的孩子为第2层……

(2)树中结点的最大层次称为树的深度或高度

5. 树的有序性

    结点的各子树从左向右是有次序的,子树间不能互换位置,则称该树为有序树。否则为无序树。

 

6. 树和结点的数据结构

 

(1)树的数据结构(class Tree)【见编程实验】

(2)节点的数据结构(class TreeNode)【见编程实验】

【编程实验】树与结点抽象类的创建

//Tree.h

#ifndef _TREE_H_
#define _TREE_H_

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

namespace DTLib {

//树结点的定义
template <typename T>
class TreeNode : public Object
{
public:
    T value;
    TreeNode<T>* parent;

    TreeNode()
    {
        parent = NULL;
    }

    virtual ~TreeNode() = 0;
};

template <typename T>
TreeNode<T>::~TreeNode()
{
}

//树的定义
template <typename T>
class Tree : public Object
{
public:
    typedef TreeNode<T> Node;
protected:
    Node* m_root;
public:
    Tree(){m_root = NULL;}
    virtual bool insert(Node* node) = 0; //插入结点
    virtual bool insert(const T& value, Node* parent) = 0;
    //删除节点(注意,返回被删除的子树!)
    virtual SharedPointer<Tree<T> > remove(const T& value) = 0; //删除结点
    virtual SharedPointer<Tree<T> > remove(Node* node) = 0;
    virtual Node* find(const T& value) const = 0; //查找节点
    virtual Node* find(Node* node) const = 0;
    virtual Node* root() const = 0; //获取根结点
    virtual int degree() const = 0; //树的度
    virtual int count() const = 0;  //树的结点数目
    virtual int height() const = 0; //树的高度
    virtual void clear() = 0;       //清空树
};

}

#endif // _TREE_H_

7. 小结

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

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

(3)树的结点包含一个数据及若干指向其它结点的指针

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

原文地址:https://www.cnblogs.com/5iedu/p/7748451.html