zoukankan      html  css  js  c++  java
  • 5.5树和森林

    5.5.1树的存储结构

    树的存储结构通常采用如下三种表示方式。

    1.双亲表示法

    这种存储结构求指定结点的双亲(或祖先包括根)都是十分方便的。

    但是在这种存储表示法中,求指定结点的孩子或其他后代则可能需要遍历整个结构。

    2.孩子链表法

    与双亲表示法相反,孩子链表表示法便于那些涉及孩子结点的操作的实现,而不适用操作Parent(T,x)。

    带双亲的孩子链表

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #define MaxTreeSize 100
     5 typedef char DataType;
     6 
     7 struct cnode//孩子链表结点类型
     8 {
     9     int child;//孩子结点在指针数组中的序号
    10     struct cnode *next;
    11 };
    12 typedef struct cnode CNode;
    13 
    14 struct panode
    15 {
    16     DataType data;//树中结点数据域
    17     int parent;//双亲位置域
    18     CNode *firstchild;//孩子结点头指针
    19 };
    20 typedef struct panode PANode;//指针数组结点类型
    21 
    22 struct ctree
    23 {
    24     PANode nodes[MaxTreeSize];//指针数组
    25     int n, r;//n为结点数,r为根结点在指针数组中的位置(即下标)
    26 };
    27 typedef struct ctree CTree;
    28 
    29 void main()
    30 {
    31 
    32 }

    3.孩子兄弟表示法

    这种存储结构的最大优点是,它和二叉树的二叉链表表示完全一样,因此可利用二叉树的各种算法来实现对树的操作。

    5.5.2树、森林与二叉树的转换

    树、森林到二叉树的转换

    我们知道,树中每个结点至多只有一个最左边的孩子(长子)和一个右邻的兄弟,按照这种关系,只要按下面的方法即可将一棵树转换成二叉树:首先在所有兄弟结点之间加一道连线,然后再对每个结点保留长子的连线,去掉该结点与其他孩子的连线。由于树根没有兄弟,所以转换后的二叉树,其根结点的右子树必为空。

    将一个森林转换为二叉树的方法是:先将森林中的每棵树转化成二叉树,然后再将各二叉树的根结点看作是兄弟连在一起,形成一棵

    二叉树。

  • 相关阅读:
    Oracle 删除某个用户下的对象
    解决11g导出时,空表不能导出问题
    Oracle常用sql
    Oracle 创建表空间和用户
    chapter4.1、函数,参数
    chapter3.6、标准库datetime
    chapter3.5内建函数
    简单选择排序和二元选择排序
    chapter3.4解析式、生成器
    列表解析练习
  • 原文地址:https://www.cnblogs.com/denggelin/p/5700255.html
Copyright © 2011-2022 走看看