PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列。
用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子。中序遍历的顺序正好是序列从小到大的顺序,因此中序遍历的时候顺便赋值就可以了,最后层次遍历输出。
思路一:中序遍历的时候赋值
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <queue>
#define LEFT 0
#define RIGHT 1
using namespace std;
const int maxn=;
int cnt=;
/*
中序遍历的顺序即为序列从小到大的顺序,因此中序遍历的时候顺便赋值,
最后层次遍历输出即可。
*/
struct Node{
int val;
int left;
int right;
}node[maxn]; void dfs(int i,int*a){
if(i==-)
return;
dfs(node[i].left,a);
node[i].val=a[cnt];
cnt++;
dfs(node[i].right,a);
} int main()
{
int n,l,r;
int a[maxn];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d %d",&l,&r);
node[i].left=l;
node[i].right=r;
}
for(int i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
dfs(,a);
queue<Node>q;
q.push(node[]);
bool first=true;
while(!q.empty()){
Node tmp=q.front();
q.pop();
if(first){
printf("%d",tmp.val);
first=false;
}
else{
printf(" %d",tmp.val);
}
if(tmp.left!=-)
q.push(node[tmp.left]);
if(tmp.right!=-)
q.push(node[tmp.right]);
} return ;
}
思路二:两次dfs
这是我最开始的解题思路,复杂化了,不过好歹一次就AC了。
节点leftnum存储它的左子树的节点个数,rightnum存储它的右子树的节点个数,num存储以该节点为根节点的子树的节点个数。smallernum则是存储值比它小的节点个数。id代表了该节点是其父亲节点的左孩子还是右孩子,father是其父节点。
这样我们就能根据smallernum来判断该节点在序列(从小到大排列)中的位置。
第一次dfs把leftnum、rightnum、num给求出来。
第二次dfs则是计算smallernum,这里要分两种情况来考虑。
1.节点i为左孩子
那么往上追溯祖先节点,直到第一个id为右孩子的节点p,那么节点i的smallernum则为:
p的父亲节点的smallernum+1(即p的父亲节点)+节点i的左子树个数
2.节点i为右孩子
那么节点i的smallernum则为:
其父亲节点的smallernum+1(其父亲节点)+节点i的左子树个数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <queue>
#define LEFT 0
#define RIGHT 1
using namespace std;
const int maxn=; struct Node{
int id;
int val;
int father;
int left;
int right;
int leftnum; //the number of left subtree
int rightnum;
int smallernum; //the number of left nodes,not only left subtree.
int num; //the number of this subtree
}node[maxn];
/*
calculate leftnum and num
*/
int dfsNum(int i){
if(i==-)
return ;
int l=node[i].left;
int r=node[i].right;
if(i==){
node[i].id=LEFT;
node[i].father=-;
}
if(l!=-){
node[l].id=LEFT;
node[l].father=i;
}
if(r!=-){
node[r].id=RIGHT;
node[r].father=i;
}
node[i].leftnum=dfsNum(l);
node[i].rightnum=dfsNum(r);
node[i].num=node[i].leftnum+node[i].rightnum+;
return node[i].num;
} void dfsSmallerNum(int i){
if(i==-)
return ;
int l=node[i].left;
int r=node[i].right;
dfsSmallerNum(l);
node[i].smallernum=;
if(node[i].id==LEFT){
int p=node[i].father;
while(p!=-){
if(node[p].id==RIGHT)
break;
p=node[p].father;
}
if(l!=-)
node[i].smallernum+=node[l].num;
if(p>){
node[i].smallernum+=node[node[p].father].smallernum+;
}
}
else{
if(l!=-)
node[i].smallernum+=node[l].num;
if(i>)
node[i].smallernum+=node[node[i].father].smallernum+;
}
dfsSmallerNum(r);
}
int main()
{
int n,l,r;
int a[maxn];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d %d",&l,&r);
node[i].left=l;
node[i].right=r;
}
for(int i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
dfsNum();
dfsSmallerNum();
int res[maxn];
for(int i=;i<n;i++){
//printf("%d smaller:%d left:%d right:%d num:%d\n",i,node[i].smallernum,node[i].leftnum,node[i].rightnum,node[i].num);
int p=node[i].smallernum;
node[i].val=a[p];
}
queue<Node>q;
q.push(node[]);
bool first=true;
while(!q.empty()){
Node tmp=q.front();
q.pop();
if(first){
printf("%d",tmp.val);
first=false;
}
else{
printf(" %d",tmp.val);
}
if(tmp.left!=-)
q.push(node[tmp.left]);
if(tmp.right!=-)
q.push(node[tmp.right]);
} return ;
}
PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历的更多相关文章
- PAT (Advanced Level) Practise - 1099. Build A Binary Search Tree (30)
http://www.patest.cn/contests/pat-a-practise/1099 A Binary Search Tree (BST) is recursively defined ...
- pat 甲级 1099. Build A Binary Search Tree (30)
1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]
题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...
- 1099. Build A Binary Search Tree (30)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- PAT (Advanced Level) 1099. Build A Binary Search Tree (30)
预处理每个节点左子树有多少个点. 然后确定值得时候递归下去就可以了. #include<cstdio> #include<cstring> #include<cmath& ...
- 【PAT甲级】1099 Build A Binary Search Tree (30 分)
题意: 输入一个正整数N(<=100),接着输入N行每行包括0~N-1结点的左右子结点,接着输入一行N个数表示数的结点值.输出这颗二叉排序树的层次遍历. AAAAAccepted code: # ...
- PAT甲级——1099 Build A Binary Search Tree (二叉搜索树)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90701125 1099 Build A Binary Searc ...
- 1099 Build A Binary Search Tree
1099 Build A Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a bi ...
- pat1099. Build A Binary Search Tree (30)
1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
随机推荐
- iOS 固定定位不兼容、input获取焦点后位置不对。
第一次写博客~ 大家悠着看,有则改之,无则加冕,对不对的给个回复,让我知道你的存在. 在做活动页的时候,经常会碰到一些需要弹出显示的输入框(情节前提:本人安卓机~),前天自己写的时候自己调试没问题后 ...
- 使用ramdisk内存分区给常用软件加速
::参考内存盘软件https://download.csdn.net/download/zly6tz/9717137cls @echo off ::内存虚拟盘符-内存盘大小自己查看源目录大小 ::下面 ...
- beta冲刺————第三天(3/5)
完善的具体内容: 前端: (1)可以进行修改文字大小背景 其中,金色的文字个人觉得很好看,点赞.(我很满意啊) (2)可以改变成夜间模式(也很不错啊) 后端: 尝试将本地的后端war文件,以及数据库传 ...
- [python]pip 版本9.0.1升级到10.0.1故障解决办法
问题背景: 在做android自动化时使用到第三方库uiautomator时,提示要安装,但安装该uiautomator库时提示当前的pip版本偏低,需要安装10.0.1版本方可.但在升级到升级到该版 ...
- ICP点云配准原理及优化
ICP算法简介 根据点云数据所包含的空间信息,可以直接利用点云数据进行配准.主流算法为最近迭代算法(ICP,Iterative Closest Point),该算法是根据点云数据首先构造局部几何特征, ...
- SASS对css的管理
一.SASS简介 SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般 ...
- redis在.net架构中的应用(2)--并发和原子操作不可兼得
在上一篇文章中,我主要向大家介绍了利用servicestack连接redis以及一些redis的基本数据类型,传送门 本文中,我将通过一个具体应用场景为大家介绍redis中的并发和原子操作 其中用到的 ...
- 修改Lotus notes默认浏览器
notes收到的邮件里面的链接,点了以后会自动在notes里打开,但notes很弱,加载页面总是有问题.怎么才能让他默认用ie浏览器打开呢,怎么设置,请教达人. 右下角有个office->Edi ...
- apache配置文件:http.conf配置详解
Apache的配置文件http.conf参数含义详解 Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改.主站点的配置(基本配置) (1) 基本配 ...
- UPF Usage
在 multi-voltage design 中,当涉及到多个power supply 时,需要 upf 文件来描述power细节,现将 upf 中的基本概念和使用方法记录如下: upf 中的基本概念 ...