解题过程的小记录,如有错误欢迎指出。
难度:四星(用到了BST中序是递增的特性,做完上一题有了思路再做这一题就不难了)
题目分析
给出二叉树的结构,要求填入数据满足二叉搜查树(对于每个结点,左子小于根结点,右子大于等于根结点),填入数据后输出它的层次遍历
注意点
采用静态二叉树时要注意结束标志是什么,本题是-1代表NULL
我的解题过程
思路
- 用静态二叉树来保存结构
- BST有中序遍历是递增的特性,所以对已经构造好的树进行中序遍历,按照递增插入序列
- 层次遍历输出这棵树
bug
输入数据语句打错了一个地方,后发现
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n, k = 0, cnt = 0;
vector<int> d;
struct node {
int data;
int lchild, rchild;
}Node[105];
void inorder(int index) {
if (index == -1) return;
inorder(Node[index].lchild);
Node[index].data = d[k++];
inorder(Node[index].rchild);
}
void layerorder(int index) {
if (index == -1) return;
queue<int> q;
q.push(index);
while (!q.empty()) {
int now = q.front();
q.pop();
printf("%d", Node[now].data);
cnt++;
if (cnt != n) printf(" ");
if (Node[now].lchild != -1) q.push(Node[now].lchild);
if (Node[now].rchild != -1) q.push(Node[now].rchild);
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &Node[i].lchild, &Node[i].rchild);
}
d.resize(n);
for (int i = 0; i < n; i++) {
scanf("%d", &d[i]);
}
sort(d.begin(), d.end());
inorder(0);
layerorder(0);
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
本题参考自己代码即可