二叉排序树的构造过程_快速排序的详细过程

描述

给定一个1到n的排列,按顺序依次插入到一棵二叉排序树中,请你将这棵二叉树前序遍历和后序遍历输出。

输入

第一行一个整数n。

接下来一行表示为n个整数,代表1到n的一个排列。

输出

输出所建成的二叉树的前序遍历和后序遍历。

输入样例

10(10个整数)

输出样例

2 1 6 3 5 4 9 7 8 10(前序) 1 4 5 3 8 7 10 9 6 2(后序)

提示

[二叉树的操作基本都是递归操作,只要想想如何在一个节点上判断是朝着左孩子走还是朝着右孩子走就行了。]

简要题意

给定一个1到n(1 ≤ n ≤ 100000)的排列,依次插入到一棵二叉排序树中,求前序遍历和后序遍历。

保证树高不超过50

问题分析

  • 二叉排序树

二叉排序树的构造过程_快速排序的详细过程

左节点<根节点<右节点

树高不超过50:每次插入一个元素时,不会在二叉树上走超过50步,插入的时间复杂度为O(50n)

前序遍历=输出自己+输出左字树+输出右子树+递归,时间复杂度O(n)

后序遍历=输出左字树+输出右子树+输出自己+递归,时间复杂度O(n)

具体实现(C++版)

#include <bits/stdc++.h>

using namespace std;

// ================= 代码实现开始 =================

/* 请在这里定义你需要的全局变量 */

const int N = 100005;

//二叉树节点的数据结构

//t:二叉树节点数组

struct node{

int val,l,r;

}t;

//整个二叉树的根节点,整个二叉树的大小

int root,cnt;

//在以x为根的树中插入一个数字v

//v:要插入的数字

//x:当前节点,下标

//返回根节点x

int insert(int v, int x){

if(x == 0){

//根节点还不存在,则将x变成根节点

x = ++cnt;

t.val = v;

t.l = 0;

t.r = 0;

return x;

}

//递归插入左右子树,先与根节点比较

if(t.val < v)

t.r = insert(v,t.r);

else

t.l = insert(v,t.l);

return x;

}

//以x为根的二叉树的前序遍历

//x:当前节点

//ans:存储结果的数组

void dlr(int x, vector<int> &ans){

if(x){

//加入x节点的val到ans中,递归求解左右子树

ans.push_back(t.val);

dlr(t.l,ans);

dlr(t.r,ans);

}

}

//后序遍历

void lrd(int x, vector<int> &ans){

if(x){//if(x!=0)

//递归求解左右子树,加入x节点的val到ans中

lrd(t.l,ans);

lrd(t.r,ans);

ans.push_back(t.val);

}

}

// 给定一个1到n的排列,依次插入到二叉树中,返回前序遍历和后序遍历

// n:如题意

// sequence:给定的排列,大小为n

// 返回值:将要输出的元素依次加入到返回值中

vector<int> getAnswer(int n, vector<int> sequence) {

root = cnt =0;

for(int i=0; i<int(sequence.size());++i)

root = insert(sequence,root);

vector<int> ans;

dlr(root,ans);

lrd(root,ans);

return ans;

}

本文【二叉排序树的构造过程_快速排序的详细过程】由作者: 前端后端 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4141.html

(0)
上一篇 2023-03-09 08:20:02
下一篇 2023-03-09 08:50:02

相关推荐

  • 内存检测软件显示信息

    我们常常会使用系统自带的内存诊断工具和memtest这个工具来检测内存是否存在错误。但是我们很多玩家可能都不知道QuickMemoryTestOK这个更为强大的内存检测工具。 今天我们一起来看看QuickMemoryTestOK。 1/显示内存信息 QuickMemoryTestOK的功能非常丰富,可以检测内存信息,我们可以看到内存运行的频率。但是因为Qui…

    2023-03-13
    300
  • gnu操作系统现在怎么样了_LINUX和WINDOWS的区别

    点击上方 “Linux中文社区” 关注,星标或者置顶11点30分准时推送,第一时间送达 作者:zsq_fengchen | 编辑:Linux君 Linux中文社区(ID: Linux-China)第 2 次推文 图源:百度上一篇:19个有趣的Linux 命令,最后一个?… 打死我都不敢尝试! 正文 一. 什么是linux?…

    技术频道 2023-03-09
    900
  • 抽象工厂模式的优缺点

    抽象工厂模式,这里的主体思想,是对于工厂的抽象,就是在工厂模式的基础上继续抽象。(了解工厂模式,请翻阅上期讲解) 在上期对工厂方法模式分解中,我们发现一个问题:对于新增的品类创建新的工厂,这样是很浪费资源的,而且随着新品的增加,结构会变得越来越冗余。 既然“万物皆可抽”,那五花八门的工厂自然也是可以的了。所以,抽象工厂模式更像是一个超级工厂,整合了单一、散乱…

    2023-03-13
    3100
  • 制作iso镜像文件的简单方法_怎么生成iso镜像文件

    在日常上班的工作中,有很多小伙伴需要用到光盘,但是有时却会遇到没有光驱的电脑,这该怎么办呢?其实不用担心,小编今天就跟大家分享一个将光盘制作成ISO镜像文件的方法,这样就可以装在U盘里在任何电脑上读取。 百度搜索ImgBurn软件,中文版和英文版都可以,因为操作都不难! 下载好软件之后进行安装,直接选择下一步或者Next即可。安装完之后打开软件界面如下图,然…

    2023-03-21
    000
  • Java交流题

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 2.JDK和JRE的区别是什么? 3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? 4.是否可以在static环境中访问非static变量? 5.Java支持的数据类型有哪些?什么是自动拆装箱? 6.Java中…

    2023-03-21
    000
  • flash 广告_flash卸载了还会有广告吗

    这类画面是不是特别熟悉? 广告弹窗! 主要是各类软件的弹窗。 一般开机后没多久电脑右下角就会出现。 最讨厌的是,关了还会有! 在出现这类广告的时候,千万不要急着关闭它!治标不治本,它还会再出现! ▽▽▽ 正确操作步骤(以Flash弹窗为例)▽▽▽ 1. 通过快捷键【CTRL+SHIFT+ESC】打开“任务管理器”,找到广告对应的进程(此处以【Flash He…

    2023-03-18
    100
  • hook在编程中是什么意思_flow什么意思

    什么是HOOK技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:《什么是HOOK技术?》 上面是开个玩笑,言归正传,今天来聊的话题就是安全领域一个非常重要的技术:HOOK技术。 HOOK,英文意思是“钩子” 在计算机编程中,HOOK是一种「劫持」程…

    2023-03-13
    300
  • sort函数有的上面打不开_sort排序函数用法

    今天再给大家介绍 O365 的一个新函数 sort,毫不夸张地说,在 Excel 升级到新版本之前,sort 是我最为期待的新函数之一。 以下操作原本都要通过菜单来实现,自从 sort 函数问世之后,简直太方便了: 对某一列排序 按照某一列,对整个数据表排序 对任意部分列排序 分别来看每个案例。 案例: 下图 1 为某公司员工的业绩完成情况明细表,要求如下:…

    2023-03-09
    800
  • jquery选择器和css选择器的区别_css和css3的区别是什么

    CSS3在CSS2基础上,增强或新增了许多特性, 弥补了CSS2的众多不足之处,使得Web开发变得更为高效和便捷。 CSS3的现状 浏览器支持程度不够好,有些需要添加私有前缀 移动端支持优于PC端 不断改进中 应用相对广泛 应对的策略:渐进增强 (1)坚持渐进增强的原则:让低版本浏览器能正常访问页面,高版本的浏览器用户体验更好。【重要】 比如说,同样是一个头…

    2023-03-15
    200
  • matlab中取整数和小数部分,c语言整型变量四舍五入吗

    首先说明一点,MATLAB软件是基于C语言编写开发的。因为C语言的稳定性是其他计算机编程语言所无法比拟的,所以大部分工程软件的开发都采用C语言。在C语言中,没有提供丰富的函数库;而在MATLAB语言中,已经为用户编写好大量常用函数,诸如三角函数、反三角函数、取余、取整、绝对值、开方、求和及求角等常用函数。此外,MATLAB语言继承并发展了C语言中的运算符,除…

发表回复

登录后才能评论
返回顶部
错说博客上线啦!