树的定义是递归的,与树的相关算法也是递归的。
如果我们定义一个数组,这个数组中的每一个元素是一棵树,那么这个数组就构成了一个森林。
树节点里面有指向父节点的指针,对于工程实践来说非常有帮助。
添加TreeNode.h文件:
1 #ifndef TREENODE_H 2 #define TREENODE_H 3 4 #include "Object.h" 5 6 namespace DTLib 7 { 8 9 template < typename T > 10 class TreeNode : public Object 11 { 12 public: 13 T value; 14 TreeNode<T>* parent; 15 16 TreeNode() 17 { 18 parent = NULL; 19 } 20 21 virtual ~TreeNode() = 0; 22 }; 23 24 template < typename T > 25 TreeNode<T>::~TreeNode() //提供一个空的实现,否则可能编译不过 26 { 27 28 } 29 30 } 31 32 #endif // TREENODE_H
添加Tree.h文件:
1 #ifndef TREE_H 2 #define TREE_H 3 4 #include "TreeNode.h" 5 #include "SharedPointer.h" 6 7 namespace DTLib 8 { 9 10 template < typename T > 11 class Tree : public Object 12 { 13 protected: 14 TreeNode<T>* m_root; 15 16 public: 17 Tree() 18 { 19 m_root = NULL; 20 } 21 22 virtual bool insert(TreeNode<T>* node) = 0; 23 virtual bool insert(const T& value, TreeNode<T>* parent) = 0; 24 virtual SharedPointer< Tree<T> > remove(const T& value) = 0; //删除的节点的子节点我们还需要处理,因此要返回删除节点的指针, 25 //这样有机会对里面的元素做进一步操作 26 virtual SharedPointer< Tree<T> > remove(TreeNode<T>* node) = 0; 27 virtual TreeNode<T>* find(const T& value) const = 0; 28 virtual TreeNode<T>* find(TreeNode<T>* node) const = 0; 29 virtual TreeNode<T>* root() const = 0; 30 virtual int degree() const = 0; 31 virtual int count() const = 0; 32 virtual int height() const = 0; 33 virtual void clear() = 0; 34 35 }; 36 37 } 38 39 #endif // TREE_H
小结: