这一章节开始介绍一个数据结构中的一个基本概念——树。

我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列、数组和链表等结构表征),还有一个重要的特性——层级结构需要我们去表征,例如世界杯的对阵表、遗传系谱图等等,这时候我们基于对现实世界的抽象,会很自然的理解为什么会有树这样一个数据结构。

而树这种数据结构也是能够分类的,我们将每个节点记录某种抽象的概念或者具象的事物,这样用来表征一种从属关系,我们称其为抽象型数据结构的树。或者将每个节点储存一些数据,基于这棵树我们能够完成检索查找之类的操作,我们称其为检索型数据结构的树。

关于树的基本的术语和其中的基本概念,这里不再累述,读者可以通过查找离散数学或者图论的资料了解。

树的实现:

既然了解到了树存在的必要性和重要性,下面我们就应该去关注怎样实现一棵树了。在《啊哈算法》中,作者介绍了用一维数组实现的二叉树,这是基于二叉树一些非常特殊的形式,但是对于更加一般的情况的多叉树呢?我们需要采用更加一般的方法。对于树中的每一个节点,我们很关注如下集合很有价值的数据:它的父节点?它的子节点?存在该节点的数据?关于它的父节点和子节点,其实就是需要我们表征一种“联系”,即通过该节点,我们能够轻松的找到和它关联的父节点和子节点,我们很容易便可以想到指针。而基于一维数组实现的二叉树,就是二叉树的基本性质,通过为节点标号从而实现了指针的作用。

通过上面的分析,我们能够定义树节点的结构体。

struct Treenode{<data>TreeNode* parent;vector<TreeNode*> children;};

树的遍历:

树本质上也是一种图,因此这里采用基本的深搜就可以完成对树的遍历。

void printLabels(TreeNode* root){cout<< root-> <data><<endl;for(int i = 0;i < root->chilren.size();i++)printLabels(root->children[i]);}

基于对树的遍历,我们同时可以完成对树的高度的计算。

int height(TreeNode* root){int h = 0;for(int i = 0;i < root->children.size();i++)h = max(h,1+height(root->children[i]));return h;}

关于一个树结构的一个简单建模:

Q:中世纪时,为了更好的首尾保护更多领地,城市和要塞之间都具有多层城墙。偏执狂领主建筑的Strawgoh要塞达到了这中间城模式的极致。下图是这种要塞的结构图。那么现在给出一个要塞的图,两个城市之间没有门只能通过梯子翻越城墙,请问再给出的城墙图中,从一个城市到另一个城市最多翻阅多少城墙?

Input:

将每个城市看成一个圆,然后程序会给出n个圆的圆心和半径用来表示这个城墙结构。

用树建立起来的解题模型:这道问题从原始的图上来看并不好直观的得到它会与树联系起来,但是我们进一步的看这个图,是否像集合论当中的维恩图,而维恩图就是典型的层级结构,这正与树结构能够表征的东西呼应起来。如果基于树结构看这个问题,我们就能够将问题化约成,求解树结构的最长路径,也就是树的深度。这个在前面介绍“树的实现和遍历”当中曾经简单的介绍过它的实现方法。

显然整体的思路有了,下面我们面临的最大问题就是,如何基于题目给出的数据,建立这样一棵树结构?

建树的方法:首先基于一个基本的递归过程,也可以说成一个深度优先建树的过程。我们从根节点开始,假设我们已经有了一个判断两个城市是否是父子关系的函数,我们能够写出如下的过程:

TreeNode* getTree(int root){TreeNode* ret = new TreeNode();//指向该节点的指针for(int i = 0;i < n;i++)if(isChild(root,i))ret -> children.push_bcak(getTree(ch));//树节点数据中储存儿子结点的向量表return ret;}

那么好了,下面我们面临的问题就变成了如何设计判断两个城市之间是否是父子关系的isChild()函数了。如何判断两个点在树结构中是否是父子关系呢?通过观察我们能够发现,必须两个区域是直接的包含关系,即对于圆B,A,如果B内含与A并且不存在这样一个圆C使得圆C内含与A且B内含于C。清楚了这一点,在拿到两个区域判断其双方是否是父子关系的时候,首先我们当然要利用简单的几何知识要判断他们是否是包含关系,随后我们通过穷举的方法来遍历剩下的所有区域由此来判断是否存着这样一个上文中提到的区域C,即我们能够写出如下的简单代码。

 int n , y[100],x[100],radius[100];bool inclose(int a , int b)//判断圆b是否在圆a的内部

{double dis;//圆心距
dis = sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));if(radius[b]-radius[a] >= dis)return  true;elsereturn false;}bool isChild(int parent , int child){if(!inclose(parent,child)) return false;int flag = 1;for(int i = 0;i < n;i++){if(i == parent || i == child)  continue;if(inclose(parent,i) && inclose(i,child))  {flag = 0;break;}}if(flag)  return true;else      return false;} 

转载于:https://www.cnblogs.com/rhythmic/p/5630767.html

《算法问题实战策略》-chaper21-树的实现和遍历相关推荐

  1. 【白话机器学习】算法理论+实战之LightGBM算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  2. 【白话机器学习】算法理论+实战之Xgboost算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  3. 【白话机器学习】算法理论+实战之关联规则

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  4. 【白话机器学习】算法理论+实战之AdaBoost算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  5. 【白话机器学习】算法理论+实战之K近邻算法

    作者1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻 ...

  6. 算法导论—分治策略(C语言)

    在分治策略中,我们递归的求解一个问题,在每层递归中应用以下三个步骤: 1.分解   将问题划分为一个个子问题,子问题形式与原问题一致,只是规模更小 2.解决   这里的解决是指递归的求解出子问题,或对 ...

  7. 数据结构与算法—二叉排序(查找)树

    目录 前言 树 二叉树 二叉排序(搜索)树 概念 构造 主要方法 findmax(),findmin() isContains(int x) insert(int x) delete(int x) 完 ...

  8. 数据挖掘十大经典算法--CART: 分类与回归树

    一.决策树的类型  在数据挖掘中,决策树主要有两种类型: 分类树 的输出是样本的类标. 回归树 的输出是一个实数 (例如房子的价格,病人呆在医院的时间等). 术语分类和回归树 (CART) 包含了上述 ...

  9. 【白话机器学习】算法理论+实战之决策树

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法A ...

最新文章

  1. 【万级并发】电商库存扣减如何设计?不超卖!
  2. c# string总结
  3. 利用geogle中memory工具分析js占用内存
  4. Oracle 20c数据库开启原生的区块链表、AutoML以及持久化内存支持
  5. 汽车之家港股上市发行价定为176.3港元 募资35.6亿港元
  6. 自然场景下文本检测主要数据集
  7. python实现给微信指定好友定时发消息
  8. filter动态参数 maven_多环境下Maven项目的管理
  9. 深度学习一(PyTorch物体检测实战)
  10. php搜索功能与jquery搜索功能,JavaScript_基于jQuery实现页面搜索功能,jQuery实现页面搜索,搜索筛选 - phpStudy...
  11. 埃默里大学有计算机专业吗,埃默里大学计算机科学硕士排名第30(2020年TFE Times排名)...
  12. 紫薇~还记得大明湖畔的HTML5智力拼图吗?
  13. plotly绘制简单图形4--饼形图
  14. 关于联想小新16pro无网络问题_雪雪专享篇(安装网卡驱动篇)
  15. Linux: lo 网络接口
  16. logout 注销登录
  17. cgb2109-day02
  18. python列表按照长度排序_Python程序根据元素的长度对列表进行排序?
  19. HCIE-Security安全-ICMP重定向、不可达攻击
  20. 【原创】被误解的匈牙利命名法

热门文章

  1. 【网络安全工程师面试题】数据库存在的漏洞及渗透方法
  2. 这份中台与数据报表的干货我写了10小时,真不想告诉你
  3. 玩转大数据可视化,推荐几个必学的工具
  4. VUE使用lodop实现前端打印页面指定内容
  5. java mapreduce api_Hadoop实战-初级部分 之 Hadoop MapReduce JAVA API
  6. 如何设置坐标原点值_数控车如何精确对刀,干数控的你们都知道吗?
  7. 通用mapper_通用Mapper快速开发,搭建项目
  8. pytorch学习笔记(一):Tensor(张量)
  9. 合数分解1(C语言)
  10. Pytorch——DataLoader的学习笔记~