当前位置: 首页 > news >正文

医院网站建设价格国内十大软件培训机构

医院网站建设价格,国内十大软件培训机构,垣宝建设工程集团网站,美食网站建设书P1827 [USACO3.4] 美国血统 American Heritage(前序 中序 生成后序) 一、前言 二叉树入门题。涉及到树的基本知识、树的结构、树的生成。 本文从会从结构,到完成到,优化。 二、基础知识 Ⅰ、二叉树的遍历 前序遍历&#xff…

P1827 [USACO3.4] 美国血统 American Heritage(前序 + 中序 生成后序)

一、前言

二叉树入门题。涉及到树的基本知识、树的结构、树的生成。
本文从会从结构,到完成到,优化。

二、基础知识

Ⅰ、二叉树的遍历

  • 前序遍历: 左右
  • 中序遍历:
  • 后序遍历: 左右

通过上面的观察,可得根在那,就是什么方式的遍历

Ⅱ、二叉树的结构

二叉树的结构:节点值 + 左节点指针 + 右节点指针

// c++的结构体写法
struct node {char val;node *left;node *right;node() : val(0), left(nullptr), right(nullptr){}node(int val) : val(val), left(nullptr), right(nullptr){}node(int val, node *left, node *right) : val(val), left(left), right(right){}
};
// c语言结构体写法
struct node {char val;struct node *left;struct node *right;node() : val(0), left(NULL), right(NULL){}node(int val){val = val;left = NULL;right = NULL;{node(int val, struct node *left, struct node *right) {val = val;left = left;right = right;}
};

三、直接思路

通过 前序 + 中序 直接生成 树。然后再前序遍历(可以过)
现在的问题,就变成了。怎么生成树了。
估计大家在学习数据结构,二叉树这一章节中。老师肯定讲过手写这个题(通过前序或后序找到根节点,然后把中序分成两部分,左子树,右子树)。但是现在怎么把他变成代码呢?

#include <iostream>
using namespace std;struct node {char val;node *left;node *right;node() : val(0), left(nullptr), right(nullptr){}node(char x) : val(x), left(nullptr), right(nullptr){}node(char x, node *left, node *right) : val(x), left(left), right(right){}
};
/*
s1 中序
[inorderBegin, inorderEnd)
s2 前序
[preorderBegin, preorderEnd)
上述就是现在树的范围
再分割子树的范围就可以了
明白范围!!!左端点可取,右端点不可取
*/
node *traversal(string s1, int inorderBegin, int inorderEnd, string s2, int preorderBegin, int preorderEnd) {if (preorderEnd == preorderBegin) return nullptr;char val = s2[preorderBegin];node *root = new node(val);if (preorderEnd - preorderBegin == 1) return root;int delimiterIndex; // 左右子树的分割点for (delimiterIndex = inorderBegin; delimiterIndex < inorderEnd; delimiterIndex++) {if (s1[delimiterIndex] == val) break;}// 左子树// 中序int leftInorderBegin = inorderBegin;int leftInorderEnd = delimiterIndex;// 前序int leftPreorderBegin = preorderBegin + 1;int leftPreorderEnd = preorderBegin + 1 + delimiterIndex - inorderBegin;// 右子树int rightInorderBegin = delimiterIndex + 1;int rightInorderEnd = inorderEnd;int rightPreorderBegin = preorderBegin + delimiterIndex - inorderBegin + 1;int rightPreorderEnd = preorderEnd;root->left = traversal(s1, leftInorderBegin, leftInorderEnd, s2, leftPreorderBegin, leftPreorderEnd);root->right = traversal(s1, rightInorderBegin, rightInorderEnd, s2, rightPreorderBegin, rightPreorderEnd);return root;
}void dfs(node *root) {if (!root) return ;dfs(root->left);dfs(root->right);cout << root->val;
}int main() {node *tree;string s1, s2;cin >> s1 >> s2;tree = traversal(s1, 0, s1.size(), s2, 0, s2.size());dfs(tree);return 0;
}

在这里插入图片描述

四、优化

通过上面可以发现,他在生成树的过程中,就是经行的后续遍历。所以不用直接生成树。

#include <iostream>
using namespace std;void traversal(string s1, int inorderBegin, int inorderEnd, string s2, int preorderBegin, int preorderEnd) {if (preorderEnd == preorderBegin) return;char val = s2[preorderBegin];int delimiterIndex; // 左右子树的分割点for (delimiterIndex = inorderBegin; delimiterIndex < inorderEnd; delimiterIndex++) {if (s1[delimiterIndex] == val) break;}// 左子树// 中序int leftInorderBegin = inorderBegin;int leftInorderEnd = delimiterIndex;// 前序int leftPreorderBegin = preorderBegin + 1;int leftPreorderEnd = preorderBegin + 1 + delimiterIndex - inorderBegin;// 右子树int rightInorderBegin = delimiterIndex + 1;int rightInorderEnd = inorderEnd;int rightPreorderBegin = preorderBegin + delimiterIndex - inorderBegin + 1;int rightPreorderEnd = preorderEnd;traversal(s1, leftInorderBegin, leftInorderEnd, s2, leftPreorderBegin, leftPreorderEnd);traversal(s1, rightInorderBegin, rightInorderEnd, s2, rightPreorderBegin, rightPreorderEnd);cout << val;
}int main() {string s1, s2;cin >> s1 >> s2;traversal(s1, 0, s1.size(), s2, 0, s2.size());return 0;
}

五、相关题目

  • LeetCode 105. 从前序与中序遍历序列构造二叉树
  • LeetCode 106. 从中序与后序遍历序列构造二叉树

六、最后

创作不易,留个赞,鼓励一下把!

http://www.hkea.cn/news/157964/

相关文章:

  • 哈尔滨app开发seo自学网官网
  • 网站答辩ppt怎么做全网关键词云在哪里看
  • 网站建设 视频seo关键词词库
  • 网站应用软件设计成都网站建设技术外包
  • 用哪个软件做网站网址查询域名解析
  • 网站安全优化域名停靠浏览器
  • 我做中医培训去哪个网站找学员谷歌排名算法
  • 如何将网站让百度收录网店培训班
  • wordpress旧版页面编辑界面百度seo推广计划类型包括
  • 网站建设茶店网网站换友链平台
  • 珠海建设工程信息网站网络营销百度百科
  • 帮别人做网站推广犯法吗关键词排名网站
  • 建设通网站是政府的么高端网站定制设计
  • 玉溪做网站的公司夸克搜索网页版
  • wordpress导航主题haowseo挂机赚钱
  • 广州做家教的网站深圳网络推广招聘
  • 锐捷网络公司排名seo技术介绍
  • 新圩做网站公司拼多多代运营一般多少钱
  • 免费网站可以做cpa?短视频营销的优势
  • b2b外贸营销型网站如何做电商赚钱
  • 建设无障碍网站seo分析报告怎么写
  • 电子商务网站开发进什么科目模板自助建站
  • 威海市住房和城乡建设局官方网站北京seo营销公司
  • 开网页卡优化关键词排名工具
  • wordpress右侧文章归档东莞公司seo优化
  • 个人网站建设需求说明书免费外链生成器
  • 湖南网站建设的公司排名网页制作网站制作
  • 公司网页网站建设 ppt模板app开发公司排行榜
  • 网站开发yuanmus联合早报 即时消息
  • 为什么只有中国人怕疫情seo 页面