题目就是给出一棵二叉搜索树,已知根节点为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)-二叉树遍历的更多相关文章

  1. 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 ...

  2. pat 甲级 1099. Build A Binary Search Tree (30)

    1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  3. 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 ...

  4. 1099. Build A Binary Search Tree (30)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  5. PAT (Advanced Level) 1099. Build A Binary Search Tree (30)

    预处理每个节点左子树有多少个点. 然后确定值得时候递归下去就可以了. #include<cstdio> #include<cstring> #include<cmath& ...

  6. 【PAT甲级】1099 Build A Binary Search Tree (30 分)

    题意: 输入一个正整数N(<=100),接着输入N行每行包括0~N-1结点的左右子结点,接着输入一行N个数表示数的结点值.输出这颗二叉排序树的层次遍历. AAAAAccepted code: # ...

  7. PAT甲级——1099 Build A Binary Search Tree (二叉搜索树)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90701125 1099 Build A Binary Searc ...

  8. 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 ...

  9. pat1099. Build A Binary Search Tree (30)

    1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

随机推荐

  1. mysql用户管理与权限

    1.设置密码 set password for 用户名@localhost = password('密码'); 2.取消密码 set password for 用户名@localhost = pass ...

  2. Django商城项目笔记No.10用户部分-登录接口

    Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...

  3. Java多线程学习笔记之二缓存

    1.高速缓存 由来:处理器处理能力原因大于主内存(DRAM)访问速率,为了弥补这个差距,引入了高速缓存. 高速缓存是一种存取速率远比主内存大而容量远比主内存小的存储部件,每一个处理器都有其高速缓存.在 ...

  4. sql !=与null

    在写SQL 条件语句是经常用到 不等于‘<>’的筛选条件,此时要注意此条件会将字段为null的数据也当做满足不等于的条件而将数据筛选掉. 例:表A A1  B1 1 0 2 1 3 NUL ...

  5. BZOJ5102:[POI2018]Prawnicy(贪心,堆)

    Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大. Input 第一行包含两个正整数n,k(1<= ...

  6. Django使用静态文件

    除了由服务器生成的HTML文件外,网页应用一般需要提供其它必要的文件 —— 比如图片文件.JavaScript脚本和CSS样式表 —— 来为用户呈现出一个完整的网站. 在Django中,我们将这些文件 ...

  7. 6、JVM--类文件结构(上)

    6.1.概述 写的程序需要经编译器翻译成由0和1构成的二进制格式才能由计算机执行 6.2.无关性基石 Java在刚刚诞生之时曾经提出过一个非常著名的宣传口号:“一次编写,到处运行(Write Once ...

  8. Dubbo -- 系统学习 笔记 -- 安装手册

    安装手册 示例提供者安装 示例消费者安装 Zookeeper注册中心安装 Redis注册中心安装 简易注册中心安装 简易监控中心安装 管理控制台安装 推荐使用Zookeeper注册中心 你可以只运行D ...

  9. centos 7 安装jira 破解

    http://blog.csdn.net/itjinglun/article/details/52240479

  10. VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面

    本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...