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

浙大数据结构:04-树6 Complete Binary Search Tree

这道题利用了完全二叉树的性质,我也参考了一些代码写的。
(自己一开始写了别的方法,但一直过不了最后一个测试点,红温了)
机翻:

1、条件准备

用vector存输入的数据,另一个数组存输出的结果,n是结点个数,node是指针,指输入数组的下标,这么写是什么意思呢?我们下面接着说。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a(1010), b(1010);
int n;
int node = 0;
 输入数据和最后的输出数据代码都简单,主要是中间排序和inorder是干什么的不好理解。
我们先分析一下完全二叉树的性质,假设从上到下从左到右给完全二叉搜索树依次标号,根节点为0,那么每一个结点对应的左结点的标号为2*n+1,右结点为2*n+2,n是该结点的标号。
而排序是什么意思呢?我们把输入数据排序后,从小到大依次输出就是该完全二叉搜索树的中序遍历!这个地方自己可以举几个例子推一下。
所以排序后我们已知完全二叉搜索树的中序遍历,我们求它的层序遍历。求法就是利用上述性质,把答案存到该数组中,从前往后输出就是层序遍历的结果。

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cin >> n;

  for (int i = 0; i < n; i++)
    cin >> a[i];

  sort(a.begin(), a.begin() + n);
  inorder(0);
  int f = 1;
  for (int i = 0; i < n; i++)
  {
    if (f)
    {
      cout << b[i];
      f = 0;
    }
    else
      cout << ' ' << b[i];
  }
}

2、  inorder函数

这个函数其实就是遍历标号,号怎么标的?按刚才所说那样标号。
其实这步就是在找中序遍历的下标,把前面得到的值放进来即可
void inorder(int index)
{
  if (index >= n)
    return;
  inorder(2 * index + 1);
  b[index] = a[node++];
  inorder(2 * index + 2);
}

3、总结

其实这道题这个思路一开始还是蛮难接受的,我也是分析想了好久才大致明白。
总之这个思路对于理解完全二叉搜索树与中序遍历会更加深刻。
完整代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a(1010), b(1010);
int n;
int node = 0;

void inorder(int index)
{
  if (index >= n)
    return;
  inorder(2 * index + 1);
  b[index] = a[node++];
  inorder(2 * index + 2);
}

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cin >> n;

  for (int i = 0; i < n; i++)
    cin >> a[i];

  sort(a.begin(), a.begin() + n);
  inorder(0);
  int f = 1;
  for (int i = 0; i < n; i++)
  {
    if (f)
    {
      cout << b[i];
      f = 0;
    }
    else
      cout << ' ' << b[i];
  }
}


http://www.kler.cn/a/298663.html

相关文章:

  • SpringBoot+Vue养老院管理系统设计与实现【开题报告+程序+安装部署+售后讲解】
  • 【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?
  • ABAP 两个内表不同名称字段赋值的方法
  • Linux vi/vim 编辑器:功能强大的文本处理工具
  • 【微信小程序获取用户手机号
  • 5大常见高并发限流算法选型浅析
  • 具有RC反馈电路的正弦波振荡器(文氏桥振荡器+相移振荡器+双T振荡器)
  • 基于SSM架构的农产品朔源系统
  • RAFT协议(算法)
  • C#中的两个问号
  • 后端开发面经系列--百度内容生态C++一面
  • Script-server: 一款开源的脚本管理工具,为你的Python脚本提供一个直观的 Web UI
  • 【机器学习】--- 逻辑回归算法
  • /var/log/secure安全日志分析
  • 基于 Redis 的分布式锁实现原理及步骤
  • Redis访问工具
  • maven-helper插件解决jar包冲突实战
  • day10-配置文件日志多线程
  • Oracle之用TO_CHAR函数将日期格式转化为不带前导零的月份和日
  • 第三部分:3---环境变量
  • 基于Python的电影推荐系统设计与实现---附源码80129
  • Linux中的wc -l 和 ls -l 命令
  • 弱网环境socket编程应对策略
  • 【解决keil不能跳转函数声明的问题】
  • 循环有几种写法
  • 【机器学习】概率图模型中的推断以及精确推断的基本和确定消除顺序的原则