基本操作函数:

InitTree(Tree &T) 参数T,树根节点 作用:初始化树,先序递归创建
InsertNode(Tree &T, TElemType node) 插入树的结点 参数:树T,结点node 作用:在双亲数组中插入结点,增加树的结点值
InsertParent(Tree &T, TElemType node1, TElemType node2)//插入双亲数组的双亲域 参数:树T ,结点node1,结点node2
                                                                                   //作用:使双亲数组中,node2对应的双亲域为node1的下标
GetIndegree(Tree &T, TElemType node)                   //得到某结点入度 参数:树T,结点node 结点不存在返回-1
GetOutdegree(Tree &T, TElemType node)                  //得到某结点出度 参数:树T,结点node 结点不存在返回-1
PreOrder(Tree T)  参数:树T,根节点下标 作用:先序遍历树
PostOrder(Tree T) 参数:树T,根节点下标 作用:后序遍历树
LevelOrder(Tree T)参数:树T            作用:层序遍历树

功能实现函数:

CreateTree(Tree &T) 参数T,树根节点 作用:创建树,调用InsertNode,InsertParent
Traverse(Tree T)    参数T,树根节点 作用:PreOrder InOrder PostOrder LevelOrder遍历树

实验所用树:

实验所用树

创建及遍历截图:

创建及遍历截图

代码:

/*
Project: Tree_parent(树-双亲表示法)
Date:    2019/02/25
Author:  Frank Yu
基本操作函数:
InitTree(Tree &T) 参数T,树根节点 作用:初始化树,先序递归创建
InsertNode(Tree &T, TElemType node) 插入树的结点 参数:树T,结点node 作用:在双亲数组中插入结点,增加树的结点值
InsertParent(Tree &T, TElemType node1, TElemType node2)//插入双亲数组的双亲域 参数:树T ,结点node1,结点node2//作用:使双亲数组中,node2对应的双亲域为node1的下标
GetIndegree(Tree &T, TElemType node)                   //得到某结点入度 参数:树T,结点node 结点不存在返回-1
GetOutdegree(Tree &T, TElemType node)                  //得到某结点出度 参数:树T,结点node 结点不存在返回-1
PreOrder(Tree T)  参数:树T,根节点下标 作用:先序遍历树
PostOrder(Tree T) 参数:树T,根节点下标 作用:后序遍历树
LevelOrder(Tree T)参数:树T            作用:层序遍历树
功能实现函数:
CreateTree(Tree &T) 参数T,树根节点 作用:创建树,调用InsertNode,InsertParent
Traverse(Tree T)    参数T,树根节点 作用:PreOrder InOrder PostOrder LevelOrder遍历树
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<iostream>
#define TElemType char
#define Max 100
using namespace std;
//树的结点数据结构
typedef struct TNode
{TElemType data;//数据域int parent;    //双亲
}TNode;
//树的数据结构
typedef struct Tree
{TNode parent[Max];int NodeNum;}Tree;
//********************************基本操作函数********************************//
//初始化树函数 参数:树T 作用:规定数据域为#,则为空,双亲为-1,则为空
void InitTree(Tree &T)
{for (int i=0;i<Max;i++){T.parent[i].data = '#';T.parent[i].parent = -1;}T.NodeNum = 0;
}
//插入树的结点 参数:树T,结点node 作用:在双亲数组中插入结点,增加树的结点值
bool InsertNode(Tree &T, TElemType node)
{if (node != '#'){T.parent[T.NodeNum++].data = node;//插入到双亲数组中return true;}return false;
}
//插入双亲数组的双亲域 参数:树T ,结点node1,结点node2
//作用:使双亲数组中,node2对应的双亲域为node1的下标
bool InsertParent(Tree &T, TElemType node1, TElemType node2)
{int place1, place2;place1 = -1;place2 = -1;for (int i=0;i<T.NodeNum;i++)//查找两点是否存在{if (node1 == T.parent[i].data)place1 = i;if (node2 == T.parent[i].data)place2 = i;}if (place1 != -1 && place2 != -1)//两点均存在{T.parent[place2].parent = place1;return true;}return false;
}
//得到某结点入度 参数:树T,结点node 结点不存在返回-1
int GetIndegree(Tree &T, TElemType node)
{int place = -1;for (int i = 0;i<T.NodeNum;i++){if (T.parent[i].data == node)place = i;}if (place!=-1)//结点存在{if(T.parent[place].parent!=-1)return 1;//双亲只能有一个else return 0; //根节点没有双亲,即没有入度}return -1;
}
//得到某结点出度 参数:树T,结点node 结点不存在返回-1
int GetOutdegree(Tree &T, TElemType node)
{int place = -1;int outdegree = 0;for (int i = 0;i<T.NodeNum;i++){if (T.parent[i].data == node)place = i;}if (place != -1){for (int i = 0;i < T.NodeNum;i++){if (T.parent[i].parent == place)outdegree++;}return outdegree;}return -1;
}
//先序遍历 参数:树T,根节点下标
void PreOrder(Tree T,int i)
{if (T.NodeNum != 0){cout << T.parent[i].data << " ";for(int j=0;j<T.NodeNum;j++){if(T.parent[j].parent==i)PreOrder(T,j);//按左右先序遍历子树}}
}
//后序遍历 参数:树T,根节点下标
void PostOrder(Tree T,int i)
{if (T.NodeNum != 0){for (int j = 0;j<T.NodeNum;j++){if (T.parent[j].parent == i)PostOrder(T, j);//按左右先序遍历子树}cout << T.parent[i].data << " ";}
}
//层序遍历 参数:树T
void LevelOrder(Tree T)
{queue<TNode> q;//借助队列if (T.NodeNum!=0){TNode temp;//暂存要出队的结点q.push(T.parent[0]);//根结点入队while (!q.empty())//队列非空{temp = q.front();q.pop();cout<<temp.data<<" ";for (int j = 0;j<T.NodeNum;j++){if (T.parent[T.parent[j].parent].data == temp.data)//当前结点的父节点的数据域与弹出的相同 //因为temp没有保存下标,只能按这种方式比较,默认结点名称不同q.push(T.parent[j]);//队列先进先出,先入左孩子}}}
}
//**********************************功能实现函数*****************************//
//创建树,调用InsertNode,InsertParent
void CreateTree(Tree &T)
{int nodenum = 0;int parent;TElemType node,node1,node2;printf("请输入树的结点个数:");cin >> nodenum;parent = nodenum - 1;printf("请输入树的结点名称(空格隔开):");while (nodenum--){cin >> node;InsertNode(T,node);}printf("请输入树的结点间的双亲关系(一对为一双亲关系,A B表示A为B的双亲):\n");while (parent--){cin >> node1>>node2;InsertParent(T,node1,node2);}printf("\n");
}
//入度
void Indegree(Tree &T)
{TElemType node;int indegree;printf("请输入结点名称:\n");cin >> node;indegree = GetIndegree(T, node);if (-1 != indegree)cout << "该结点入度为:" << indegree << endl;elsecout << "结点不存在。" << endl;
}
//出度
void Outdegree(Tree &T)
{TElemType node;int outdegree;printf("请输入结点名称:\n");cin >> node;outdegree = GetOutdegree(T, node);if (-1 != outdegree)cout << "该结点出度为:" << outdegree << endl;elsecout << "结点不存在。" << endl;
}
//遍历功能函数 调用PreOrder InOrder PostOrder LevelOrder
void Traverse(Tree T)
{int choice;while (1){printf("********1.先序遍历    2.后序遍历*********\n");printf("********3.层次遍历    4.返回上一单元*********\n");printf("请输入菜单序号:\n");scanf("%d", &choice);if (4 == choice) break;switch (choice){case 1: {printf("树先序遍历序列:");PreOrder(T,0);printf("\n");}break;case 2: {printf("树后序遍历序列:");PostOrder(T,0);printf("\n");}break;case 3: {printf("树层序遍历序列:");LevelOrder(T);printf("\n");}break;default:printf("输入错误!!!\n");break;}}
}
//菜单
void menu()
{printf("********1.创建     2.某点入度*********\n");printf("********3.某点出度 4.遍历*************\n");printf("********5.退出\n");
}
//主函数
int main()
{Tree T;int choice = 0;InitTree(T);while (1){menu();printf("请输入菜单序号:\n");scanf("%d", &choice);if (5 == choice) break;switch (choice){case 1:CreateTree(T);break;case 2:Indegree(T);break;case 3:Outdegree(T);break;case 4:Traverse(T);break;default:printf("输入错误!!!\n");break;}}return 0;
}

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

树-双亲表示法(含全部代码)相关推荐

  1. 《数据结构》-树(双亲表示法)

    双亲表示法 孩子链表表示法 孩子兄弟表示法 树的存储结构 双亲表示法 对应的树为 特点 找双亲容易,找孩子难 C 语言的类型描述 #define MAX_TREE_SIZE 100 /* 结点结构 * ...

  2. (数据结构)树的双亲表示法

    树的双亲表示法 此前写过二叉树的顺序存储和链式存储,此篇文章将介绍普通树是如何存储的... 通常,存储具有普通树结构数据的方法有 3 种: 双亲表示法 孩子表示法 孩子兄弟表示法 而本篇文章将优先介绍 ...

  3. 树的存储结构以及实现代码

    树的存储结构以及实现代码   1.首先假设有一个树如下: 2.双亲表示法 我们假设以一组连续空间存储树的结点,在每个结点中,附设一个指示器指示其双亲结点到链表中的位置.这样,每个结点除了知道自己是谁以 ...

  4. 6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 树的双亲表示法 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版) ...

  5. 2021秋季《数据结构》_EOJ 1063.树的双亲存储法(parent+child / parent)

    题目 前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系).下面介绍树的双亲存储法. ...

  6. 树的先序遍历(双亲表示法)

    题目描述 给出一棵树的双亲表示法结果,用一个二维数组表示,位置下标从0开始,如果双亲位置为-1则表示该结点为根结点 编写程序,输出该树的先根遍历结果. 输入 第一个输入t,表示有t棵树 接着每棵树输入 ...

  7. 数据结构——树|N叉树之孩子双亲表示法——顺序存储结构+链表

    N叉树之孩子双亲表示法 左边是表头结构,相当于一个顺序存储,开始只做了一个顺序结构,发现诸多不便之处,随即开始孩子双亲表示法的学习,这个表示法,需要定义三个结构: 孩子结构 表头结构 树的结构 按理说 ...

  8. 数据结构c语言——树的三种存储结构(双亲表示法、孩子表示法、兄弟表示法)

    在大量的应用中,人们曾使用多种形式的存储结构来表示树.这里,我们介绍3种常用的链表结构. 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置, ...

  9. 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

    文章目录 一. 树的概念 二. 树的存储结构 (一). 双亲表示法 (二). 孩子表示法 1. 定长结点链表存储结构 2. 孩子链表存储结构 (三). 孩子兄弟表示法 一. 树的概念 树(Tree)是 ...

最新文章

  1. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)
  2. vue.js crud_如何使用VS Code和ADO.NET使用ASP.NET Core执行CRUD操作
  3. Web前端工程师的一些常见误区
  4. bzoj 1787 紧急集合
  5. cdh 安装_0623-6.2.0-如何在CDH中安装CFM
  6. windows客户端安装
  7. java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal
  8. NullReferenceException C#中的异常
  9. (转载)mysql 用drop和delete方法删除用户的区别
  10. 百度云:centos7.0+ 安装宝塔与ShopXO开源商城(从0搭建到部署上线) - 教程篇
  11. web前端学习之HTML
  12. 使用nutch爬取数据时出现的问题_在使用聚氨酯发泡机时出现问题的解决方法!...
  13. 嵌入式 uboot引导kernel,kernel引导fs
  14. IOS中JSON数据的解析
  15. 解决gridview导出到excel中汉字出现乱码的问题
  16. android开发中出现R.java was modified manually! Reverting to generated version!问题的解决方法...
  17. DB2 exception: Cannot create PoolableConnectionFactory SQLCODE=-142
  18. python 数字类型判断_Python中 各种数字类型的判别(numerica, digital, decimal)
  19. Linux 系统服务之间 实现免密登陆
  20. java 医疗监护_医疗监护仪解决方案

热门文章

  1. 蓝桥杯训练(python)Day2
  2. 大商创MySQL不支持_大商创配置文件config.php详解
  3. 2020届一轮复习高中数学必考点高中函数知识点总结(纯干货)
  4. 网络游戏外挂编写原理
  5. EBAZ4205矿卡控制卡
  6. Interaction triggers in WPF
  7. android中的系统应用
  8. 使用python画K线图(蜡烛图)
  9. 【Codeforces 1038D】Slime
  10. css button阴影效果,css怎么给button设置阴影