L2-006 树的遍历 (层序遍历)
根据访问根节点与左右子树的先后顺序,二叉树一般有三种遍历方式:先序遍历、中序遍历和后序遍历。
只要给定中序遍历序列与先序或后序中的一种,可以还原二叉树结构。学习数据结构课程时,一直都只会手动构建还原二叉树。今天试着解决了该问题,记录一下成果。
#include<iostream>
#include<cstdio>
using namespace std; const int maxn = ;
int preorder[maxn], inorder[maxn]; struct Node{
int l, r;
}nodes[maxn]; int build(int pl, int pr, int il, int ir)
{ // 以[pl,pr] [il, ir]建立二叉树,返回根节点 if(pl>pr) return ;
if(il>ir) return ;
int root = preorder[pl]; // 在中序遍历中找到跟节点,分成左右子树递归建树
int pos = il;
while(inorder[pos]!=root) pos++;
int _left = pos - il; nodes[root].l = build(pl+, pl+_left, il, pos-);
nodes[root].r = build(pl+_left+, pr, pos+, ir); return root;
} void PreReverse(int rt)
{ // 先序遍历
cout<<rt<<' '; if(nodes[rt].l) PreReverse(nodes[rt].l); if(nodes[rt].r) PreReverse(nodes[rt].r);
} void PostReverse(int rt)
{ // 后序遍历
if(nodes[rt].l) PostReverse(nodes[rt].l); if(nodes[rt].r) PostReverse(nodes[rt].r); cout<<rt<<' ';
} int main()
{
int N; cin>>N; for(int i=;i<N;i++)
cin>>preorder[i];
for(int i=;i<N;i++)
cin>>inorder[i]; int rt = build(, N-, , N-); PreReverse(rt);
PostReverse(rt); /*
7
3 5 7 6 1 8 2
7 5 1 6 3 8 2 后序遍历结果:
7 1 6 5 2 8 3
*/ return ;
}
稍加修改应该可以解决此题(L2-006 树的遍历),最后输出层序遍历的序列,即BFS。(开始理解错了,对结果没影响)
AC代码如下:
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std; const int maxn = ;
int postorder[maxn], inorder[maxn]; struct Node{
int l, r;
}nodes[maxn]; int build(int pl, int pr, int il, int ir)
{ // 以[pl,pr] [il, ir]建立二叉树,返回根节点 if(pl>pr) return ;
if(il>ir) return ;
int root = postorder[pr]; // 在中序遍历中找到跟节点,分成左右子树递归建树
int pos = il;
while(inorder[pos]!=root) pos++;
int _left = pos - il; nodes[root].l = build(pl, pl+_left-, il, pos-);
nodes[root].r = build(pl+_left, pr-, pos+, ir); return root;
} int main()
{
int N; cin>>N; for(int i=;i<N;i++)
cin>>postorder[i];
for(int i=;i<N;i++)
cin>>inorder[i]; int rt = build(, N-, , N-);
cout<<rt; queue<int> q;
if(nodes[rt].l)
q.push(nodes[rt].l);
if(nodes[rt].r)
q.push(nodes[rt].r); while(!q.empty())
{
int k = q.front(); q.pop();
cout<<' '<<k;
if(nodes[k].l)
q.push(nodes[k].l);
if(nodes[k].r)
q.push(nodes[k].r);
} return ;
}
// 2019.3.21 更新
今天做题发现层序遍历并不是单纯的BFS,在leetcode上碰到这样一个需要严格按照树的层次输出的题:
二叉树结构: 输出结果:
想了半天并没有想到标记每一个层次的办法,搜索解答才恍然大悟,代码非常简单!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
q.push(root); vector<vector<int> > ans;
if(root==NULL) return ans; while(!q.empty())
{
vector<int> tmp; // 保存每一层的遍历结果
int size = q.size();
while(size--)
{
TreeNode *now = q.front(); q.pop();
tmp.push_back(now->val); if(now->left) q.push(now->left);
if(now->right) q.push(now->right); }
ans.push_back(tmp);
}
return ans;
}
};
L2-006 树的遍历 (层序遍历)的更多相关文章
- Hdu1805-Expression(表达式树模版题+层序遍历树+栈的基本应用)
2018-11-23-02:27:37 原题链接 题目描述: 题目一目了然. 本题思路: 本题很容易能想到是构建表达式树然后按照层序逆序输出即可. AC代码: #include <cstdio& ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
- PTA 7-10 树的遍历(二叉树基础、层序遍历、STL初体验之queue)
7-10 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数 ...
- Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作
什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...
- List Leaves 树的层序遍历
3-树2 List Leaves (25 分) Given a tree, you are supposed to list all the leaves in the order of top do ...
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
L2-006 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...
- PTA 树的遍历(根据后序中序遍历输出层序遍历)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第 ...
- 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)
题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...
- PAT 1099. Build A Binary Search Tree (树的中序,层序遍历)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
随机推荐
- API文档管理工具
系统庞大之后,前后端分离开发,前端调用后端提供的接口,请求协议一般是 HTTP,数据格式一般是 JSON.后台只负责数据的提供和计算,而完全不处理展现逻辑和样式:前端则负责拿到数据,组织数据并展现的工 ...
- 我写的第一个DELPHI的控制台程序,留作纪念。
program Project2; {$APPTYPE CONSOLE} uses SysUtils; const s = 'hello' ; var a , b , c : integer; f ...
- JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。
卸载事件(onunload) 当用户退出页面时(页面关闭.页面刷新等),触发onUnload事件,同时执行被调用的程序. 注意:不同浏览器对onunload事件支持不同. 如下代码,当退出页面时,弹出 ...
- 快速创建vuepress项目(使用vuepress写文档)
vuepress的官方文档:https://vuepress.vuejs.org/zh/guide/ 参考:https://segmentfault.com/a/1190000016333850 ht ...
- http协议 头部字段 referrer
学习笔记,非原创,抄自:https://www.cnblogs.com/amyzhu/p/9716493.html:https://blog.csdn.net/java_zhangshuai/arti ...
- sql count 函数用法
count(*) 会查询所有记录数,,包括为null值的数据: count(column)不会包含 column值为null的情况: count(1) 和 count(*)相同,,不同的是,,mysq ...
- LeetCode第九题—— Palindrome Number(判断回文数)
题目描述 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same ...
- Let's Encryt免费SSL证书申请[我司方案]
Let's Encrypt颁发的证书是目前生产的大多数浏览器都信任的,您只需下载并运行Let's Encrypt客户端来生成一个证书即可. 在颁发证书之前,需要验证您的域名的所有权.首先,在您的主机上 ...
- cocos2D-X 常用功能封装
Packaging_Kernel.h #pragma once #include <string> #include <map> #include <vector> ...
- 模拟MySQL命令
staff_table 1,Alex Li,22,13651054608,IT,2013-04-01 2,Jack Wang,30,13304320533,HR,2015-05-03 3,Rain L ...