树的广义表

人工智能实验课实现ID3算法时,需要把最终的决策树输出出来

考虑每个节点的名字长度、孩子个数都不同,直接层级遍历对齐起来很麻烦且容易出现歧义,所以决定用广义表的形式输出决策树

由于广义表中的元素顺序具有相对顺序,所以采用形式Root({weight1}subTree1,{weight2}subTree2,...)来表示树,其中每个subTree都是广义表,{weight}是根和这棵子树相连边的权重值

现在用http://blog.csdn.net/u013018721/article/details/38042561?utm_source=tuicool&utm_medium=referral中给出的ID3决策树实例作为例子说明

此时根节点为“年龄”,则一开始建立的广义表应为“年龄”({<=30}“长相”子树,{>30}【不见】),其中为了区分,【...】表示叶子

而“长相”子树也是用相同的方法递归地建立,则最终建成的广义表为:

“年龄”({<=30}“长相”({帅}“收入”({高}【见】,{中等}“公务员”({是}【见】,{不是}【不见】),{低}【不见】),{丑}【不见】),{>30}【不见】)

下面是代码实现,首先构建根节点,再递归地构建所有子树,直到叶子

树节点定义(孩子兄弟表示法)

struct TNode
{
	AttrType 	type; //属性名
	AttrValue 	value,//边权重
				res;  //数据
	TNode *firstchild, *nextsibling;
};

输出广义表实现

void showTreeLists(TNode *T)
{
	TNode *p;
	if(!T)
		return;
    //输出边的权重
	cout<<"{";
	if(T->value!=voi)
		cout<<name_map[T->value];
	cout<<"}";

    //输出节点属性名
	if(T->type==contact_lenses)
		cout<<name_map[T->res];
	else
		cout<<type_map[T->type];

    //递归构建所有孩子所对应的子树
	p = T->firstchild;
	if (p)
	{
		cout<<"(";
		while (p)
		{
			treelists(p);
			p = p->nextsibling;
			if (p)cout<<‘,‘;
		}
		cout<<")";
	}
}

  

时间: 2024-11-05 19:26:55

树的广义表的相关文章

数据结构(C语言第2版)-----数组,广义表,树,图

任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构. 认识数组和广义表 数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型.其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储.在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型. 数组一旦被建

数据结构-顺序树的创建以及按广义表输出

1 #include"stdio.h" 2 #define MaxSize 30 3 typedef char DataType; 4 typedef struct TreeNode{ 5 DataType data[MaxSize]; 6 int count; 7 }BinTree; 8 int k = 0; 9 //初始化树 10 void initBinTree(BinTree *t) 11 { 12 for( int i= 0; i< MaxSize; i++) 13 {

数据结构算法C语言实现(十九)--- 5.5&amp;5.6&amp;5.7广义表

一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一是使其可视化,而是验证算法5.6.花了不少功夫才写出来(强烈建议自己动手写一写),最后是借助树形结构的角度才找到一个不错的解决办法.按照<数据结构编程实验>的分类,数据结构无非线性结构.树状结构.图结构,可以说树是特殊的图(图的最小生成树),线性表示特殊的树.....扯远了! 二.头文件 补充版字

数据结构之用C++实现广义表

广义表,相对于链表较复杂,相对于树又较简单....用来过渡顺序表和树是非常好的选择. 废话不多说,一言不合就贴代码. /* *文件说明:广义表相关声明及定义 *作者:高小调 *日期:2016-12-12 *集成开发环境:Microsoft Visual Studio 2010 */ #ifndef __GENERALLIST_H__ #define __GENERALLIST_H__ #include<assert.h> enum Type{ HEAD, SUB, VALUE }; struc

广义表的基本操作实现

广义表的四个特征:(1)广义线性表:(2)元素复合性:(3)元素递归性:(4)元素共享性 广义表的上述四个特征对于他的使用价值和应用效果起到了很大的作用.广义表的结构相当灵活,它可以兼容线性表.数组.树和有向图等各种常用的数据结构.当二维数组的每行或每列作为子表处理时,二维数组就是一个广义表:如果限制广义表中元素的共享和递归,广义表和树对应:如果限制广义表的递归并允许数据共享,则广义表和图对应. 广义表的基本操作有:(1)创建一个广义表(我以头尾链表作为存储结构):(2)取表头:(3)取表尾:(

广义表的C++简单实现

广义表是数据结构中非常关键的一部分,它的学习对于树和二叉树有很大的起承作用.那么,它是怎么实现的呢?广义表的实现应用到了一个很熟悉的算法--递归.来看看它的代码吧! #pragma once #include<iostream> #include<cassert> using namespace std; enum Type { HEAD,//头 VALUE, //值 SUB, //子表 }; struct GeneralizedNode { Type _type; General

广义表 (五)

5.1广义表-广义表的定义和基本运算 顾名思义,广义表是线性表的推广.也有人称其为列表(Lists,用复数形式以示与统称的表List 的区别). ⒈广义表的定义和性质 我们知道,线性表是由n 个数据元素组成的有限序列.其中每个组成元素被限定为单元素,有时这种限制需要拓宽.例如,中国举办的某体育项目国际邀请赛,参赛队清单可采用如下的表示形式: (俄罗斯,巴西,(国家,河北,四川),古巴,美国,(),日本) 在这个拓宽了的线性表中,韩国队应排在美国队的后面,但由于某种原因未参加,成为空表.国家队.河

【数据结构】第5章 数组和广义表

§5.1 数组的定义 多维数组的理解 typedef ElemType Array2[m][n]; //等价于typedef ElemType Array1[n];typedef Array1 Array2[m]; 即一个n维数组类型可以定义为其数据元素为(n-1)维数组类型的一维数组类型. 数组一旦被定义,它的维度和维界就不再改变,因此除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作. §5.2数组的顺序表示和实现 多维数组的空间分配,有以列序为主序(FORTRAN)或以行序为主

根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归实现

根据输入的广义表建立子女右兄弟链的二叉树表示,该二叉树对应于广义表对应的普通树.先考虑更复杂的情形,如果广义表中存在共享表,则将其转换为带共享子树的二叉树表示,每一共享子树带有附加头节点,其左链指针指向共享子树,最后输出带共享子树的子女右兄弟链表示(广义表形式) C++代码: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stack> 4 #include <string> 5 #in