1、树的定义
树是—种非线性的数据结构
树是由n (n≧0)个结点组成的有限集合
-如果n = 0 , 称为空树;
-如果n > 0 , 则:
有—个特定的结点称之为根(root)的结点
根结点只有直接后继,但没有直接前驱
除根以外的其它结点划分为m (m ≧ 0)个互不相交的有限集合T0 , T1,
…,Tm-1, 每个集合又是一棵树,并且称之为根的子树(sub tree)
树的示例
树中度的概念
- 树的结点包含—个数据及若干指向子树的分支
-结点拥有的子树数目称为结点的度
度为0的结点称为叶结点
度不为0的结点称为分支结点
- 树的度定义为所有结点中度的最大值 树的度示例:度为3的树
树中的前驱和后继
-结点的直接后继称为该结点的孩子
相应的,该结点称为孩子的双亲
-结点的孩子的孩子的......称为该结点的子孙
相应的,该结点称为子孙的祖先
-同—个双亲的孩子之间互称兄弟
树的前驱和后继示例
树中结点的层次
- 根为第1层
-根的孩子为第2层
- ...
树中结点时最大层次称为树的深度或高度
树的有序性
如果树中结点的各子树从左向右是有次序的,子树间不
能互换位置,则称该树为有序树,否则为无序树。
森林的概念
-森林是由 (n ≧ 0 )棵互不相交的树组成的集合
由3棵树组成的森林
树的—些常用操作
-将元素插入树中
-将元素从树中删除
-获取树的结点数
-获取树的高度
-获取树的度
-清空树中的元素- 。。。
树在程序中表现为—种特殊的数据类型
树中的结点也表现为—种特殊的数据类型
树与结点的类关系
2、编程实验
树与结点抽象类的创建 Tree.hTreeNode.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; //虽然大多数教科书没有,然而在实际工程中是十分必要的,后续课程会讲解 TreeNode() { parent = NULL; } virtual ~TreeNode() = 0; }; template < typename T > TreeNode<T>::~TreeNode() { } } #endif // TREENODE_H
Tree.h
#ifndef TREE_H #define TREE_H #include "TreeNode.h" #include "SharedPointer.h" namespace DTLib { 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 hight() const = 0; virtual void clrear() = 0; }; } #endif // TREE_H
main.cpp
#include <iostream> #include"Tree.h" using namespace std; using namespace DTLib; int main() { Tree<int>* t; TreeNode<int>* tn; return 0; }
3、小结
树是一种非线性的数据结构
结点拥有唯一前驱(父结点)和若干后继(子结点)
树的结点包含—个数据及若干指其它结点的指针
树与结点在程序中表现为 特殊的数据类型