第51课 - 树的定义与操作

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.h 

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;    //虽然大多数教科书没有,然而在实际工程中是十分必要的,后续课程会讲解

    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、小结 

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

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

            树的结点包含—个数据及若干指其它结点的指针 

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


猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80449611