第三十一篇,C++面经之手写代码(五)

2023-05-16

这一篇先写个二叉树的题目,二叉树也是面试中常考到的算法与数据结构的知识点。

一、二叉树的生成与层序遍历

这一篇写个从#include从main开始的完整代码。
首先stNode定义了二叉树的节点结构,即存储一个数据,指向左右子节点。
func()是输出不分层的实现方法,即层序遍历后把整个树一层层展开、接续,串行地存储到一个std::vector中;levelOrder()是输出分层的实现方法,按树的原有层次存储遍历的结果,使用了一层嵌套的std::vector结构。
gen()是二叉树生成算法,用了递归,输入n是树的层数,cur是当前该生成第几层了,root是第cur层的上层父节点,即cur层生成的是root的左右子节点;main()函数中调用gen()生成了一个5层的完全二叉树,并用func()做了一次输出不分层的层序遍历,感兴趣的朋友可以拿levelOrder()看看输出分层的结果。

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include <future>

//二叉树生成、层序遍历(仅遍历,输出不分层)
#include <queue>
using namespace std;

struct stNode
{
	stNode(int n) : num(n), left(nullptr), right(nullptr) {}
	int num;
	stNode* left;
	stNode* right;
};
//
// 层序遍历,输出不分层
void func(stNode* root, std::vector<int>& tmpVector)
{
	std::queue<stNode*> tmpQueue;
	if (root == nullptr)
		return;

	tmpQueue.push(root);
	while (tmpQueue.size() > 0)
	{
		stNode* tmp = tmpQueue.front();
		tmpVector.push_back(tmp->num);

		if (tmp->left != nullptr)
			tmpQueue.push(tmp->left);
		if (tmp->right != nullptr)
			tmpQueue.push(tmp->right);

		tmpQueue.pop();
	}
}
// 
// 输出分层 
std::vector<std::vector<int>> levelOrder(TreeNode* root)
{
	// write code here
	std::vector<std::vector<int>> res;
	
	if (!root) return res;
	
	std::queue<TreeNode*> qu;
	qu.push(root);
	while (!qu.empty())
	{
		int size = qu.size();
		std::vector<int> vec;
		while (size--)
		{
			TreeNode* node = qu.front();
			qu.pop();
			vec.push_back(node->val);
			if (node->left) qu.push(node->left);
			if (node->right) qu.push(node->right);
		}
		if (vec.size() > 0) res.push_back(vec);
	}
	return res;
}

void gen(int n, int cur, stNode* root)
{
	if (cur <= n)
	{
		root->left = new stNode(root->num * 2);
		root->right = new stNode(root->num * 2 + 1);
		gen(n, cur + 1, root->left);
		gen(n, cur + 1, root->right);
	}
}

int main()
{
	stNode* root1 = new stNode(1);
	int datum = 2;
	gen(5, 2, root1);

	std::vector<int> res;
	func(root1, res);
	for (auto a : res)
		std::cout << a << std::endl;
	return 0;
}

在输出不分层方法func()中,也仅是输出结构展开成一维,元素的先后顺序还是要遵循原有的层级及左右顺序,考虑到这一层隐含约束,采用先入先出的队列结构std::queue作为中转比较合适,从root层开始,每个节点先将自己加入队列,然后加入其左右子节点,将queue的队首弹出并push进vector中;如此循环往复,直到queue为空即可。
在输出分层方法levelOrder()中,queue的作用和不分层方法中一样,只不过入队出队的控制有所区别。因为输出要分层,所以对树的每一层都保存一个vector,同时对queue的size做精细控制与使用,获取size时总是表征当前层中节点的个数,如此便能向每层的vector中完整地保存该层节点的遍历结果;每遍历完一层,将本层vectorpush进外层vector;如此循环往复,即可实现输出分层的层序遍历,且保留同一层中各节点的左右先后顺序。

二、输出整数的各个位上的数字

比如数字703,依次将百位的7、十位的0、个位的3输出,不考虑正负,这是一个典型的除与模的计算。
倒序输出如下,输出的依次是3、0、7,这是最简单的做法:

void func(unsigned int number)
{
    do
    {
        std::cout << number % 10 << std::endl;
    } while ((number /= 10) != 0);
}

正序输出,见有的用一边scanf一边printf的,这种纯属取巧而且万一直接给你个完整数字呢?还有用数组或者vector存放每一位的,但显然也不是最优解,最优解应当是要求不用缓存。代码如下:

void func(unsigned int number)
{
    unsigned int pow = 1, tmp = number;
    while ((tmp /= 10) != 0)
    {
        pow *= 10;
    }
    
    do
    {
        std::cout << number / pow << std::endl;
        number %= pow;
        pow /= 10;
    } while (pow != 0);
}

先把最高位找出来,是10的多少次方,存到pow里,然后倒着逐步往个位找,这里注意,尤其第二个while的控制条件,要防止出现中间如果有哪一位是0的时候不输出的bug。

三、翻转一个数字

接上一题,把数字反转输出,比如输入723,输出327,需要考虑正负,比如输入-723,输出-327。
在上一题倒序输出的基础上,代码如下:

void func(int number)
{
    if (number < 0)
    {
        std::cout << "-";
        number = abs(number);
    }
    do
    {
        std::cout << number % 10;
    } while ((number /= 10) != 0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三十一篇,C++面经之手写代码(五) 的相关文章

  • 堆栈应用:表达式求值(C语言)

    文章目录 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义大致过程具体代码 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义 中缀表达式 xff1a 运算符号位于两个运算数之间 如 xff
  • andrsoid studio 长期编辑

    andrsoid studio 2020 02 08 修改build gradle配置 Top level build file where you can add configuration options common to all s
  • 使用 Maven 搭建 Mybatis 环境

    一 创建项目 1 点击 File gt New gt Module 2 选择左侧的 Maven xff0c 由于只是创建一个普通的项目 xff0c 此处点击 Next 即可 3 输入 GroupId 和 ArtifactId 4 配置 ma
  • ubuntu安装npm命令

    ubuntu安装npm命令 摘要 xff1a npm全称Node Package Manager xff0c 是node的包管理工具 xff0c 是用JavaScript写出来的工具 xff0c 被内置进了node中 xff0c 是随同No
  • zynq操作系统: Linux驱动开发AXIDMA篇

    前言 由于bram形式的速率限制 xff0c 在同样紧急的时间条件下 xff0c 还是改回了axidma的方式来降维打击 xff0c 对于几兆的速率 xff0c 颇有种杀鸡用牛刀的感觉 xff0c 没办法 xff0c 原来的刀就是差一点 x
  • C# 对RabbitMQ使用

    1 安装NuGet包RabbitMQ Client 2 生产者 确认机制 1 含义 xff1a 就是应答模式 xff0c 生产者发送一条消息之后 xff0c Rabbitmq服务器做了个响应 xff0c 表示收到了 2 特点 xff1a 异
  • CSS—— grid 网格布局

    文章目录 1 grid 网格布局 1 grid 网格布局 display gridgrid 属性是以下属性的简写属性 默认 grid gap xff0c none xff0c 200px 网格之间的距离grid template rows
  • 【图文解析】给定一个链表,判断链表中是否有环

    目录 例题描述解题思路代码实现 例题描述 给定一个链表 xff0c 判断链表中是否有环 为了表示给定链表中的环 xff0c 我们使用整数 pos 来表示链表尾连接到链表中的位置 xff08 索引从 0 开始 xff09 如果 pos 是 1
  • Centos7执行yum install *时出现“Peer‘s Certificate has expired.“

    一 引言 今天在安装OpenResty的时候 xff0c 出现了 34 Peer 39 s Certificate has expired 34 的问题 xff0c 详细错误如下 xff1a root 64 kubernetes sudo
  • git常用指令

    1 查看分支创建来源 指令 xff1a git reflog show 分支名 由图可以看出a分支是由master创建出来的 2 查看分支情况 查看远程分支 指令 xff1a git branch r 查看所有分支 指令 xff1a git
  • 利其器(2)——idea常用配置_提高开发效率

    文章目录 简介编码设置设置idea支持生成唯一序列化id全字母代码提示调出Run Dashboard显示方法分隔符忽略大小写提示自动导入包单行显示多个Tabs设置鼠标滚轮 43 96 ctrl 96 修改字体大小设置保存自动格式化等配置终端
  • 换硬币问题

    编写程序实现用一元人民币换成一分 xff0c 两分 xff0c 五分的硬币共50枚 三重循环 include lt stdio h gt int main int x y z x y z 分别表示一分 两分 五分的个数 for x 61 0
  • 最新ubuntu22.04 下列软件包有未满足的依赖关系 解决方案--------------------------------------------------记因为配环境而耽误的一天

    今天真的崩溃一整天了 xff0c 一直一直都在找错一直一直都在找解决方案 xff0c 我发现VM真的超多超多BUG的 xff0c 感兴趣的话可以跟我聊聊 当然这篇讲的主要不是这些BUG xff0c 而是依赖关系 如果你出现类似的情况 xff
  • python获取当前执行py文件的绝对路径

    python获取当前执行py文件的绝对路径 python3 home appuser test py span class token comment 获取当前执行py文件的绝对路径 span py file path span class
  • 【iOS】NSAttributedString 相关

    1 富文本的相关属性字段 NSAttributedString Key xff08 1 xff09 paragraphStyle span class token keyword let span paraStyle span class
  • python奇技淫巧:命令行输出漂亮的表格

    前言 最近想着用 Python写一个命令行的管理各种资源的信息的管理工具 xff0c 比如阿里云的ECS等信息 xff0c 基本的功能就是同步阿里云的资源的信息到数据库 xff0c 然后可以使用命令行查询 展现信息在命令行中的 xff0c
  • Android_基础_String资源带参数

    转载自 https www cnblogs com leelugen p 6685905 html Android 基础 String资源带参数 在android 开发 xff0c 我们通常会用string xml资源去设置textview
  • es6 — class 类,原型,原型链

    文章目录 1 意义2 语法1 由来2 constructor 3 类实例3 1 使用new 调用3 2类的继承 4 新写法5 取值函数 getter 存值函数 setter 2 原型以及原型链1 原型2 原型链3 instanceof 1
  • SQLServer注释快捷键

    SQLServer中的批量注释 批量注释批量取消注释 批量注释 Ctrl 43 K C 按住Ctrl键不放 然后依次按下K和C 批量取消注释 Ctrl 43 K U 按住Ctrl键不放 然后依次按下K和U
  • 【面试宝典】软件测试工程师2021烫手精华版(第一章测试理论篇)

    前言 xff1a 翻了很多论坛博客关于面试的文章 xff0c 很多都是不完整的 xff0c 还都是比较常见规规矩矩的 xff0c 那大家刷过的基本都不拿出来了 xff0c 都是一些大家平时见得不多 xff0c 但是面试官很看中的一些题 第一

随机推荐

  • uniapp package.json和mainfest.json,如何区分环境变量

    uniapp在hbuilder中 xff0c 导航的运行就是development xff0c 发行就是production package json 如果是往服务器上发布版本 xff0c 则是打包成zip在服务器上解压 xff0c 但注意
  • VSCode扩展时出错XHRfaile问题解决

    问题 VScode扩展插件链接网络失败XHR faile错误 解决办法 1 第一步 xff1a 文件 gt 首选项 gt 设置 gt 如下图 xff1a 2 第二步 xff1a 用户 gt 应用程序 gt 代理服务器 gt 如下图操作 xf
  • HDFS的启动流程和HA

    HDFS的启动流程 当 NameNode 启动时HDFS首先将Fsimage读入内存对元数据进行恢复 xff0c 然后再读edits文件中的更新操作在恢复后的元数据上进行执行 xff0c 使得此时的NameNode中保存的是停止前的最新状态
  • 『XXG笔记』Github pages 自定义域名

    x1f44b 本文章为我 XXG 原创 xff0c 由于个人能力有限 xff0c 此笔记可能会错漏 过时 或需要补充 x1f4d6 笔记文章由于多平台发布 xff0c 为了修改方便 xff0c 可以参观我的博客 xff1a https xx
  • 第十八篇,Simulink with Git

    一 综述 本篇以MATLAB R2021b为基础讲解如何对Simulink模型做Git管理 xff0c mdl与slx均可 Git并非只能对手写代码做版本管理 xff0c 它的应用十分广泛 xff0c 囊括了各种使用编程语言编写的代码 脚本
  • 第十九篇,解析法求解五阶多项式

    x0为初始约束 xff0c 时间为0 xff1b x1为结束约束 xff0c 时间为t coef 为求解结果 xff0c 定义x 61 at 5 43 bt 4 43 ct 3 43 dt 2 43 et 43 f xff0c 则coef
  • 第二十篇,Simulink使用痛点记录

    在工作实践中发现了MATLAB amp amp Simulink一些虽不致项目失败但的确很不方便的点 xff0c 记录下来以备持续研究 xff0c 并做分享 xff1b 都是个人认为比较基础的能力或者容易做到的特性 xff0c MATLAB
  • 第七篇(下),MPC工程化总结

    目录 一 引言 二 MPC的理解与实现 2 1 模型设计与实现 2 2 MPC工程实现步骤 三 参考资料 3 1 基础理论 3 2 Refer to Apollo 3 3 其它实例参考 3 4 MATLAB中的MPC 四 demo代码 一
  • es6 -- 解构赋值

    文章目录 1 数组的解构赋值 xff0c 按次序排列 xff0c 位置决定2 对象的解构赋值 xff0c 没有次序 xff0c 变量与属性同名即可取值 默认undefined3 字符串的解构赋值4 数值和布尔值的结构赋值5 函数结构赋值 被
  • 第二十一篇,常用Git操作记录

    一 拉取远程分支 拉取远程名叫dev的分支 git fetch origin dev 执行后本地git branch并不能看到dev git checkout dev 可以看到dev了 xff0c 在dev上开发 二 本地新建分支推送到远程
  • 第二十二篇,C++面经之问答(一)

    目录 一 传引用有没有拷贝 二 引用和指针的区别 三 构造 析构函数中可不可以调用虚函数 四 怎样区分继承和组合 五 多态的实现原理 虚表虚指针 六 用过哪些设计模式 6 1状态模式 6 2享元模式 6 3单例模式 6 4工厂模式 6 5观
  • 第二十三篇,C++面经之问答(二)

    目录 一 lambda表达式的应用场景 二 lambda表达式传引用有什么坑 三 C 43 43 为什么引入线程的语言级支持 四 如何优雅地关闭一个阻塞中的线程 五 线程不做join 或detach 会有什么问题 六 多线程同步 xff0c
  • 第二十四篇,C++面经之问答(三)

    目录 一 TCP UDP的区别 应用场景 二 UDP里client server使用的过程 三 TCP端口复用问题 四 TCP三次握手 五 TCP四次挥手 六 Qt信号槽的连接方式 七 一个信号连接多个槽时 xff0c 槽函数的调用顺序 八
  • 第二十五篇,C++面经之问答(四)

    目录 一 std string是深拷贝还是浅拷贝 xff0c 深拷贝与浅拷贝的区别 二 string vector等容器中 xff0c size和capacity的区别 三 vector和list的区别 map和set的区别 四 STL中的
  • 第二十六篇,C++面经之问答(五)

    一 new delete和malloc free的区别 new delete是C 43 43 的关键字 操作符 xff0c malloc free是C的函数 xff0c 需引入 lt stdlib h gt new会调用构造函数会初始化并返
  • 第二十七篇,C++面经之手写代码(一)

    前几篇整理 记录了面试遇到的问答题目 xff0c 接下来再开几篇 xff0c 写一写手写代码环节的题目 xff0c 尽量加上注释或者讲解 xff0c 并把代码写完整 xff0c 达到复制粘贴后可立即编译执行的程度 语言还是C 43 43 x
  • 第二十八篇,C++面经之手写代码(二)

    第二篇以几个经典排序算法开始吧 一 快速排序 span class token keyword void span span class token function QuickSort span span class token punc
  • 第三十篇,C++面经之手写代码(四)

    一 删除数组指定元素 span class token keyword void span span class token function func span span class token punctuation span span
  • es6—module模块

    文章目录 0 模块化相关0 babel配置 1 使用原因2 基本语法1 1 导出 export1 2 导入import m1 s1 s2 from 39 39 1 3注意 xff1a module静态导入 xff0c 2 1 整体加载3 1
  • 第三十一篇,C++面经之手写代码(五)

    这一篇先写个二叉树的题目 xff0c 二叉树也是面试中常考到的算法与数据结构的知识点 一 二叉树的生成与层序遍历 这一篇写个从 include从main开始的完整代码 首先stNode定义了二叉树的节点结构 xff0c 即存储一个数据 xf