编程基础 - 树与森林 (Tree and Forest)

编程基础 - 树与森林 (Tree and Forest)

返回分类:全部文章 >> 基础知识

本文将介绍线索树与森林的基础知识,并用C++实现它。

在查看本文之前,需要一些数据结构和程序语言的基础。

其中的方法还需要熟悉“栈(stack)”、“队列(queue)”和“递归”。



1 树与森林的简述 (Introduction)

  • 树是由 n ( n ≥ 0 ) n (n \ge 0) n(n0) 个结点组成的 有穷 集合。在任意一棵非空树中:

    • 每一个元素,称为结点(Node);
    • 有一个特定的结点,称为根(Root);
    • 除根结点以外,其它结点被划分成 m ( m ≥ 0 ) m (m \ge 0) m(m0) 个不相交的有限集合,每个集合也是一棵树,称为根的子树(SubTree)
  • 树的特点:

    • 分层结构;
    • 递归结构;
    • 子树的根结点有且仅有一个直接前驱,但可以有0或多个直接后继。
  • 一些术语:

    • 结点:树的数据元素;
    • 结点的度:结点下的子树个数(分支);
    • 结点的层次:从根结点到该结点的层数;
    • 终端结点(叶结点):度为0的结点;
    • 分支结点(内部结点):度不为0的结点;
    • 树的度:所有结点度中的最大值;
    • 树的深度(高度):结点的最大层数(深度从根开始到最下层叶结点,高度从最下层叶结点开始到根);
    • 根:即根结点
    • 双亲结点(父结点):结点的直接前驱;
    • 孩子结点(子结点):结点的直接后继(一棵树含有子树,子树根结点称为树根的孩子);
    • 兄弟结点:具有相同父结点;
    • 堂兄弟结点:双亲在同一层的结点;
    • 祖先:从根到该结点所经分支的所有结点;
    • 子孙:该结点下层子树中的任一结点;
    • 森林: m m m 棵不相交的树的集合;
    • 有序树:结点子树从左到右有序,且不能互换;
    • 无序树:结点子树可以互换位置。

2 树的结构 (Tree Structure)

  • 等长指针
    设置等长的结点,每个结点包含的指针个数相等,等于树的度。
    这保证了结点有足够的指针指向它的所有子女结点。但可能会产生许多空指针,造成存储浪费。

  • 子女——兄弟表示

    // 树,子女——兄弟表示结点
    template<typename T>
    class TreeNode
    {
         
        public:
        T element; // 数据
        TreeNode<T>* firstChild; // 首个孩子(最左端)
        TreeNode<T>* sibling; // 兄弟结点
    
        TreeNode(const T& e)
        {
         
            element = e;
            firstChild = 0;
            sibling = 0;
        }
        ~TreeNode()
        {
         
            delete firstChild;
            firstChild = 0;
            delete sibling;
            sibling = 0;
        }
    };

    树的结构:

    A
    B
    C
    D
    E
    F
    G
    H
    I
    J
    K

    树的关系:

    Children of A
    Children of B
    Children of C
    Child of E
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值