• 数据--第30课


    第30课 - 树的定义

    1. 定义

    树是一种非线性的数据结构,树是由n(>=0)个结点组成的有限集合。

    如果n = 0,称为空树;

    如果n > 0,则有一个称之为根(root)的结点,它只有直接后继,但是没有直接前驱;除了根以外其他的结点划分为m(m>=0)个互不相交的有限集合T0,T1,T2,...,Tm-1。每一个集合又是一棵树,并且称之为根的子树(subTree)。

     

     

    2. 树家族中的概念

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

    (2)      结点拥有的字树数称为结点的度:度为0的结点称为叶结点,度不为0的结点称之为分支节点。

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

    (4)      结点的直接后继称为该结点的孩子,相应的,该结点称为孩子的双亲。

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

    (6)      同一个双亲的孩子之间互称兄弟。

    (7)      结点的层次:根为第一层,跟的孩子为第二层。

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

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

    (10)   森林是由 n ( n>= 0 ) 棵互不相交的树组成的集合。

     

     

     

    3. 树的操作

    (1)      创建树

    (2)      销毁树

    (3)      清空树

    (4)      插入结点

    (5)      删除结点

    (6)      获取结点

    (7)      获取根结点

    (8)      获取树的结点数

    (9)      获取树的高度

    (10)   获取树的度

     

    4. 操作的实现

    l  树在程序中表现为一种特殊的数据类型。

    l  树的操作在程序中的表现为一组函数。

    Tree* Tree_Create();

    void Tree_Destroy(Tree* tree);

    void Tree_Clear(Tree* tree);

    int Tree_Insert(Tree* tree, TreeNode* node, int pos);

    TreeNode* Tree_Delete(Tree* tree, int pos);

    TreeNode* Tree_Get(Tree* tree, int pos);

    TreeNode* Tree_Root(Tree* tree);

    int Tree_Height(Tree* tree);

    int Tree_Count(Tree* tree);

    int Tree_Degree(Tree* tree);

     

     

    5. 手写代码

    main.c

    #include <stdio.h>

    #include <stdlib.h>

    #include "Tree.h"

    /* run this program using the console pauser or add your own getch, system("pause") or input loop */

     

    int main(int argc, char *argv[])

    {

        Tree* tree = Tree_Create();

       

        Tree_Destroy(tree);

       

             return 0;

    }

     

     

    Tree.h

    #ifndef _TREE_H_

    #define _TREE_H_

    typedef void Tree;

    typedef void TreeNode;

     

    /* 创建树 */

    Tree* Tree_Create();

     

    /* 销毁已存在的树 */

    void Tree_Destroy(Tree* tree);

     

    /* 将已存在的树清空为空树 */

    void Tree_Clear(Tree* tree);

     

    /* 将结点node插入到tree中的pos位置处 */

    int Tree_Insert(Tree* tree, TreeNode* node, int pos);

     

    /* 将tree中pos位置的结点删除并返回 */

    TreeNode* Tree_Delete(Tree* tree, int pos);

     

    /* 将tree中pos位置的结点返回 */

    TreeNode* Tree_Get(Tree* tree, int pos);

     

    /* 返回tree的根结点 */

    TreeNode* Tree_Root(Tree* tree);

     

    /* 返回tree的高度 */

    int Tree_Height(Tree* tree);

     

    /* 返回树的结点数 */

    int Tree_Count(Tree* tree);

     

    /* 返回树的度数 */

    int Tree_Degree(Tree* tree);

     

    #endif

     

     

    Tree.c

    #include <stdio.h>

    #include "Tree.h"

     

    Tree* Tree_Create()

    {

        return NULL;

    }

     

    void Tree_Destroy(Tree* tree)

    {

       

    }

     

    void Tree_Clear(Tree* tree)

    {

       

    }

     

    int Tree_Insert(Tree* tree, TreeNode* node, int pos)

    {

        return 0;

    }

     

    TreeNode* Tree_Delete(Tree* tree, int pos)

    {

        return NULL;

    }

     

    TreeNode* Tree_Get(Tree* tree, int pos)

    {

        return NULL;

    }

     

    TreeNode* Tree_Root(Tree* tree)

    {

        return NULL;

    }

     

    int Tree_Height(Tree* tree)

    {

        return 0;

    }

     

    int Tree_Count(Tree* tree)

    {

        return 0;

    }

     

    int Tree_Degree(Tree* tree)

    {

        return 0;

    }

     

     

     

    6. 小结

    线性结构

    树结构

    l  第一个结点:无前驱

    l  最后一个结点:无后继

    l  中间结点:一个前驱和一个后继

    l  根节点:无双亲

    l  叶结点:无后继

    l  中间结点:一个前驱和多个后继

    在一些情况下,线性结构可看作特殊的树结构。

  • 相关阅读:
    JAVA常见面试题之Forward和Redirect的区别
    springMVC学习笔记(二)-----注解和非注解入门小程序
    springMVC学习笔记(一)-----springMVC原理
    C语言关键字
    JAVA HASHMAP 如何用
    java中HashMap详解
    java中dao层和service层的区别是什么?
    到底DAO是什么?为什么要有它的存在?
    Ubuntu命令基础
    使用VMWare12.0安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/free-1122/p/11336025.html
Copyright © 2020-2023  润新知