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

新疆生产建设兵团计生办网站友情链接交易平台

新疆生产建设兵团计生办网站,友情链接交易平台,可以登录wordpress的浏览器,毕业设计做网站答辩会问什么目录 题目:树的遍历前言题目来源树的数组存储基本思想存储规则示例 建树算法关键思路代码总代码 链表法 题目:树的遍历 前言 如果不是完全二叉树,使用数组模拟树,会很浪费空间。 题目来源 本题来自 PTA 天梯赛。 题目链接: 树…

目录

  • 题目:树的遍历
    • 前言
    • 题目来源
    • 树的数组存储
      • 基本思想
      • 存储规则
      • 示例
    • 建树算法
      • 关键思路
      • 代码
      • 总代码
    • 链表法

题目:树的遍历

前言

如果不是完全二叉树,使用数组模拟树,会很浪费空间。

题目来源

本题来自 PTA 天梯赛。
题目链接: 树的遍历

题目描述
给定一棵二叉树的后序遍历和中序遍历序列,输出其层序遍历的序列。假设树中节点的键值均为互不相同的正整数。

输入格式

  • 第一行:一个正整数 N(≤30),表示二叉树的节点个数。
  • 第二行:后序遍历序列,数字间以空格分隔。
  • 第三行:中序遍历序列,数字间以空格分隔。

输出格式

  • 输出层序遍历序列,数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例

4 1 6 3 5 7 2

树的数组存储

基本思想

通过数组的索引关系表示树的父子结构,无需显式存储指针。

存储规则

  1. 根节点存储在索引 1(注意不是 0)。
  2. 对于任意节点 i
    • 左子节点索引2 * i
    • 右子节点索引2 * i + 1
    • 父节点索引i / 2(整数除法)

示例

假设有一棵二叉树:
在这里插入图片描述
我们可以通过一个数组去存储
在这里插入图片描述
树的索引对应数组的索引,树节点的值存在数组里。

建树算法

关键思路

  • 后序遍历:最后一个元素是根节点
  • 中序遍历:根节点左边是左子树,右边是右子树
  • 递归构建:分别处理左右子树

后序遍历:
结构: 左子树 — 右子树 — 根

中序遍历:
结构: 左子树,根,右子树

我们通过中序遍历找到根,就能知道左子树的个数,那么我们就能找到后序遍历左子树的范围,从而得知左子树的根。右子树同理。

算法过程:

1.确定根节点:

  • 从后序遍历序列中取出最后一个元素,这就是当前子树的根节点
  • 将这个根节点存入我们构建的树结构中

2.在中序序列中定位根节点:

  • 在中序遍历序列中查找这个根节点的位置
  • 这个位置将中序序列分为左子树和右子树两部分

3.递归构建左右子树

代码

参数说明

  • root 后序序列中当前子树的根节点索引
  • start 中序序列中当前子树的起始索引
  • ed 中序序列中当前子树的结束索引
  • idx 当前节点在tree数组中的存储位置

变量说明

  • post 为后序遍历数组
  • in 为中序遍历数组
  • tree为存储树的数组
//根据中序遍历和后续遍历构造树
void build(int root,int start,int ed,int idx)
{if(start>ed) return;//后序知道树根,直接构造数组树tree[idx] = post[root];//在中序遍历中找根位置,用来区分后序遍历左右子树位置int i = start;while(i<ed && in[i] != post[root]) i++;//构造左子树build(root - ed+i-1,start,i-1,idx*2);//构造右子树build(root - 1,i+1,ed,idx*2+1);
}

总代码

#include <iostream>
using namespace std;
#include <vector>const int N = 1e5+10;
int n;
int post[N],in[N];
vector<int> tree(N,-1);//根据中序遍历和后续遍历构造树
void build(int root,int start,int ed,int idx)
{if(start>ed) return;//后序知道树根,直接构造数组树tree[idx] = post[root];//在中序遍历中找根位置,用来区分后序遍历左右子树位置int i = start;while(i<ed && in[i] != post[root]) i++;//构造左子树build(root - ed+i-1,start,i-1,idx*2);//构造右子树build(root - 1,i+1,ed,idx*2+1);
}int main()
{cin  >> n;for(int i = 1;i<=n;i++)cin >>  post[i];for(int i = 1;i<=n;i++)cin >> in[i];build(n,1,n,1);vector<int> ans;for(int i = 1;i<tree.size();i++)if(tree[i] !=-1) ans.push_back(tree[i]);for(int i = 0;i<ans.size();i++)if(i != ans.size()-1)cout << ans[i]  <<  ' ';else cout << ans[i];return 0;
}

链表法

思路是差不多的

#include <iostream>
#include <queue>using namespace std;
const int N  =50;
int n;
int post[N],in[N];struct node
{int val;node* left;node* right;
};node* build(int root,int start,int ed)
{if(start>ed) return nullptr;//创建结点node * p = (node *) malloc(sizeof(node));p->val = post[root];//在中序遍历中找根位置,用来区分后序遍历左右子树位置int i = start;while(i<ed && in[i] != post[root]) i++;p->left = build(root - ed+i-1,start,i-1);p->right = build(root - 1,i+1,ed);return p;
}void dfs(node *p)
{queue<node> q;q.push(*p);while(q.size()){node temp = q.front();q.pop();if(temp.val != p->val)cout << " ";cout << temp.val;if(temp.left != nullptr)  q.push(*temp.left);if(temp.right != nullptr) q.push(*temp.right);} 
}int main()
{cin >> n;for(int i = 1;i<=n;i++)cin >>  post[i];for(int i = 1;i<=n;i++)cin >> in[i];node* head = build(n,1,n);dfs(head);return 0;
}
http://www.dtcms.com/wzjs/267793.html

相关文章:

  • 做网站怎么连数据库青岛百度seo代理
  • 温泉网站建设网站模板库
  • 做算命网站赚钱吗淘宝关键词搜索量排名
  • 申请一个网站空间武汉网站开发公司
  • o2o苗木网站建设国内新闻最近新闻今天
  • 安宁市建设局网站营销网课
  • 网站策划网站建设企业产品线上推广方案
  • 网站建设工作室有几个部门百度电脑版登录网站
  • 什么不属于网站推广软件miy188coo免费入口
  • wordpress vip视频靠谱seo外包定制
  • 制作做网站的基本流程网站建设制作教程
  • php网站开发实战开发百度一下你就知道
  • 开发公司向政府申请延期交付seo单页面优化
  • 福州市住房和城乡建设委员会网站大数据查询个人信息
  • google收录网站媒体宣传推广方案
  • 门户网站信息流广告怎么做上海b2b网络推广外包
  • 做的网站图片显示一半外贸全网营销推广
  • 网站建设与网页制作论文武汉seo报价
  • 女人吃男人做床视频网站南通seo
  • 网站开发的几种语言网页制作网站制作
  • 个人网站备案办理拍照淘宝关键词优化技巧
  • 公司网站优化方案可以投放广告的网站
  • 室内设计方案ppt案例seo没什么作用了
  • 做网站公司电话今日热点新闻事件标题
  • 做设计需要素材的常用网站爱站网seo综合查询工具
  • 自己做的网站和模板佛山网络排名优化
  • 上线了做网站价格贵公众号怎么推广和引流
  • 哈尔滨制作网站的公司网络营销的手段包括
  • 有什么做衣服的网站营销平台有哪些
  • 长沙建个网站一般需要多少钱场景营销