树是一种非线性的数据结构
树是由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;
};
总结:
-树是一种非线性的数据结构
-结点拥有唯一的前驱(父结点)和若干后继(子结点)
-树的结点包含一个数据及若干指其他结点的指针
-树与结点在程序中表现为特殊的数据类型