• 第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)树与结点在程序中表现为特殊的数据类型

  • 相关阅读:
    java 基础学习 关键字、标识符、常量、进制、有符号表示法、变量、数据类型小节
    java 基础学习 异常的处理和自定义 学习总结
    正则表达式应用--实例应用
    ArrayList:去除集合中字符串的重复值 LinkedList:去除集合中自定义对象的重复值
    java IO流中文件,图像,视频,拷贝总结
    递归算法学习心得与体会
    如何打印身份证的正反面
    添加div间距
    Junit:NoSuchMethodError runLeaf runChild
    Ajax:async
  • 原文地址:https://www.cnblogs.com/5iedu/p/7748451.html
Copyright © 2020-2023  润新知