zoukankan      html  css  js  c++  java
  • 第52课 树的定义和操作

    1. 树的定义

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

     

    (2)树是由个结点组成的有限集合。如果n=0,称为空树。如果n>0,则:

      ①有一个特定的称之为根(root)的结点

      ②根结点只有直接后继,但没有直接前驱

      ③除根以外的其它结点划分为m(m≥0)个互不相交的有限集合T0、T1、…Tm-1,每个集合又是一棵树,并且称之为根的子树(sub tree)

    (3)森林是由n(n≥0)棵互不相交的树组成的集合

     

    2. 树中度的概念

    (1)树中的结点包含一个数据及若干指向子树的分支

    (2)结点拥有的子树数目称为结点的度(degree)

      ①度为0的结点称为叶结点

      ②度不为0的结点称为分支结点

    (3)树的度定义为所有结点中度的最大值

      ①如图c中的A结点度为3,K结点度为0,H结点度为1等

      ②整棵树的度为3

    3. 树中的前驱和后继

    (1)结点的直接后继称为该结点的孩子。相应的,该结点称为孩子的双亲(如A为B、C、D的双亲,D为H、I、J的双亲。M叶结点无孩子)。

    (2)结点的孩子的孩子的…称为该结点的子孙。相应的,该结点称为子孙的祖先。

    (3)同一个双亲的孩子之间互称兄弟。(如K和L为兄弟)

    4. 树中结点的层次

     

    (1)根为第1层,根的孩子为第2层……

    (2)树中结点的最大层次称为树的深度或高度

    5. 树的有序性

        结点的各子树从左向右是有次序的,子树间不能互换位置,则称该树为有序树。否则为无序树。

     

    6. 树和结点的数据结构

     

    (1)树的数据结构(class Tree)【见编程实验】

    (2)节点的数据结构(class TreeNode)【见编程实验】

    【编程实验】树与结点抽象类的创建

    //Tree.h

    #ifndef _TREE_H_
    #define _TREE_H_
    
    #include "Object.h"
    #include "SharedPointer.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()
    {
    }
    
    //树的定义
    template <typename T>
    class Tree : public Object
    {
    public:
        typedef TreeNode<T> Node;
    protected:
        Node* m_root;
    public:
        Tree(){m_root = NULL;}
        virtual bool insert(Node* node) = 0; //插入结点
        virtual bool insert(const T& value, Node* parent) = 0;
        //删除节点(注意,返回被删除的子树!)
        virtual SharedPointer<Tree<T> > remove(const T& value) = 0; //删除结点
        virtual SharedPointer<Tree<T> > remove(Node* node) = 0;
        virtual Node* find(const T& value) const = 0; //查找节点
        virtual Node* find(Node* node) const = 0;
        virtual Node* root() const = 0; //获取根结点
        virtual int degree() const = 0; //树的度
        virtual int count() const = 0;  //树的结点数目
        virtual int height() const = 0; //树的高度
        virtual void clear() = 0;       //清空树
    };
    
    }
    
    #endif // _TREE_H_

    7. 小结

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

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

    (3)树的结点包含一个数据及若干指向其它结点的指针

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

  • 相关阅读:
    单例模式中的懒汉式以及线程安全性问题
    单例模式中的饿汉模式
    自我管理的8个好习惯
    从java字节码角度看线程安全性问题
    工作上的建议
    从线程的优先级看饥饿问题
    多线程存在哪些风险
    DirectX SDK (June 2010)安装错误S1023,解决方法
    Microsoft DirectX SDK 2010 版本下载
    如果程序集是从 Web 上下载的,即使它存储于本地计算机,Windows 也会将其标记为 Web 文件,http://go.microsoft.com/fwlink/?LinkId=179545
  • 原文地址:https://www.cnblogs.com/5iedu/p/7748451.html
Copyright © 2011-2022 走看看