当前位置:嗨网首页>书籍在线阅读

09-输出树的各条边

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.2.4 输出树的各条边

问题描述

19.png 树采用子节点-兄弟节点表示法存放,节点结构如下。

fch→data→nsib

其中,fch表示指向第一个子节点,nsib表示指向下一个兄弟节点。编写算法,要求由根节点开始逐层输出树中的各条边,边输出格式为(Ki,Kj)。例如,对于图7.24所示的树,输出的边为AB、AC、AD、BE、BF、CG。

201.png

图7.24 一棵树

【分析】

这是西北大学考研试题。这个题目主要考查对树的子节点-兄弟节点表示法的理解和树的遍历算法设计思想。首先根据树的结构画出树的子节点-兄弟节点表示,然后考虑如何按照以上顺序输出各条边。具体算法思想如下。

(1)如果树为空树,则直接返回。

(2)如果节点处有子树,则输出这个节点的子树的各条边。

(3)递归调用函数输出兄弟节点的子树的边。

(4)递归调用函数输出下一层所有子树的边。

其中,步骤(3)与(4)分别输出兄弟节点和下一层子树的边,两者顺序不能颠倒。

第7章\实例7-06.cpp
/********************************************
*实例说明:输出树的各条边
*********************************************/
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<assert.h>
typedef struct node
{
    struct node * fch;
    char data;
    struct node * nsib;
    int level;
} NODE;
typedef NODE    * TREE;
#define SET(pos, c, l)
{
    pos = (NODE*)malloc(sizeof(NODE));
    pos->data = c;
    pos->level = l;
    pos->fch = NULL;
    pos->nsib = NULL;
    return pos;
}
void Display(TREE tree);
void ListPrintTree(TREE T);
TREE InitTree()
{
    TREE tree;
    SET(tree, '\0', 0);
}
void ReleaseTree(TREE tree)
{
    assert(tree);
    if (tree->fch != NULL)
        ReleaseTree(tree->fch);
    if (tree->nsib != NULL)
        ReleaseTree(tree->nsib);
    free(tree);
}
TREE Insert(TREE tree, char data, int level)
{
    assert(tree);
    if (tree->level == level - 1)
        SET(tree->fch, data, level);
    if (tree->level == level)
        SET(tree->nsib, data, level);
    return NULL;
}
void main()
{
    TREE T = InitTree(), temp1, temp2, temp3, temp4;
    temp1 = Insert(T, 'A', 1);
    temp2 = Insert(temp1, 'B', 2);
    temp3 = Insert(temp2, 'C', 2);
    Insert(temp3, 'D', 2);
    temp4 = Insert(temp2, 'E', 3);
    Insert(temp4, 'F', 3);
    Insert(temp3, 'G', 3);
    cout<<"树的各条边分别是"<<endl;
    Display(T->fch);
    cout<<endl;
    cout<<"以广义表形式输出树结构:\n";
    ListPrintTree(T);
    cout<<endl;
    ReleaseTree(T);
}
void Display(TREE tree)
//输出树中的各条边
{
    NODE   * p;
    if (tree == NULL)
        return;
    if (tree->fch != NULL)        //如果有子节点
    {
        //则输出全部边
        for (p = tree->fch; p != NULL; p = p->nsib)
            printf("%c%c,", tree->data, p->data);
    }
    //输出兄弟节点的全部边
    if (tree->nsib != NULL)
    Display(tree->nsib);
    //进入下一层
    if (tree->fch != NULL)
        Display(tree->fch);
}
void ListPrintTree(TREE T)
//以广义表形式输出树结构
{
    TREE p;
    if(T==NULL)
        return;
    cout<<T->data;
    p=T->fch;
    if(p!=NULL)
    {
        cout<<"(";
        ListPrintTree(p);
        p=p->nsib;
        while(p!=NULL)
        {
            cout<<",";
            ListPrintTree(p);
            p=p->nsib;
        }
        cout<<")";
    }
}

运行结果如图7.25所示。

202.png

图7.25 运行结果