树的定义
- 树是一种非线性数据结构
树是由 n(n>=0) 个结点组成的有限集合
- 如果 n = 0, 称为空树;
如果 n > 0, 则:
- 有一个特定的称之为根(root)的结点
- 根结点只有直接后继,但没有直接前驱
- 除根以外的其它结点划分为m(m>=0)个互不相交的有限集合T
0
,T1
,...,Tm-1
,每个集合又是一颗树,并且称之为根的子树(sub tree)
树的示例
树中度的概念
- 树的结点包含一个数据及若干指向子树的分支
结点拥有的子树数目称为结点的度
- 度为 0 的结点称为叶结点
- 度不为 0 的结点称为分支结点
- 树的度定义为所有结点中度的最大值
树的度的示例
度为 3 的树
树中的前驱和后继
结点的直接后继称为该结点的孩子
- 相应的,该结点称为孩子的双亲
结点的孩子的孩子的......称为该结点的子孙
- 相应的,该结点称为子孙的祖先
- 同一个双亲的孩子之间互称为兄弟
数中的结点层次
- 根为第 1 层
- 根的孩子为第 2 层
- ...
树中结点的最大层次称为树的深度或高度
树的有序性
如果树中结点的各子树从左到右是有次序的,子树之间不能互换位置,则称为该树为有序树,否则为无序树。
森林的概念
- 森林是由 n(n>=0) 颗互不相交的树组成的集合
树的操作
- 将元素插入数中
- 将元素从树中删除
- 在树中查找元素
- 获取树的结点数
- 获取数的高度
- 获取数的度
- 清空数的元素
。。。
树的数据结构
数在程序中表现为一种特殊的数据类型
template <typename T>
class Tree : public Object
{
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;
protected:
TreeNode<T> *m_root;
};
结点的数据结构
树中的结点也表现为一种特殊的数据类型
template <typename T>
class TreeNode : public Object
{
public:
T value;
TreeNode<T> *parent;
TreeNode()
{
parent = NULL;
}
virtual ~TreeNode() = 0;
};
树与结点的类关系
编程实验:树与结点抽象类的创建
文件:TreeNode.h
#ifndef TREENODE_H
#define TREENODE_H
#include "Object.h"
namespace DTLib
{
template <typename T>
class TreeNode : public Object
{
public:
T value;
TreeNode<T> *parent = nullptr;
virtual ~TreeNode() = 0;
};
template <typename T>
TreeNode<T>::~TreeNode()
{
}
}
#endif // TREENODE_H
文件:Tree.h
#ifndef TREE_H
#define TREE_H
#include "Object.h"
#include "TreeNode.h"
#include "SharedPointer.h"
namespace DTLib
{
template <typename T>
class Tree : public Object
{
public:
Tree() = default;
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;
protected:
TreeNode<T> *m_root = nullptr;
};
}
#endif // TREE_H
小结
- 树是一种特殊的数据结构
- 结点拥有唯一前驱(父结点)和若干后继(子结点)
- 树的结点包含一个数据及若干指向其它结点的指针
- 树与结点在程序中表现为特殊的数据类型
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。