Android高级面试题详解之二叉树遍历步骤

最强整理!2021年Android高级面试题,成功收获美团,小米安卓offer 前言 马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈。 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作,但是对“换工作”的理解可能仅限于写简历、投简历、面试。在跳槽之前,我也是这么想的。 当时,工作并不顺利,我的专业技能并没有很好的发挥,公司也给不了什么发展前景,就有了跳槽的打算。 我看到一家行业内还不错的上市公司在招聘这个岗位,于是我发了简历。面试后我感觉很好,但我拒绝了,因为工资没有达到预期。 经过仔细思考,我发现我准备得太匆忙了,或者根本没有准备好 阅读详情

请说一说二叉树遍历步骤?

这道题想考察什么?

1、二叉树的基本原理和遍历的方法?

考察的知识点

二叉树遍历的基本流量、二叉树的基本原理

考生如何回答
二叉树的基本概念

简单地理解,满足以下两个条件的树就是二叉树:

  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;
    3.在这里插入图片描述

二叉树的性质

二叉树具有以下几个性质:

  1. 二叉树中,第 i 层最多有 2i-1 个结点。
  2. 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
  3. 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。
二叉树的遍历

在这里插入图片描述

二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子节点,再访问右孩子节点。而层次遍历,就是按照从上到下、从左向右的顺序访问二叉树的每个节点。

先序遍历

代码如下:

//filename: BinTreeNode.h
template <typename T>
void travPre_R(BinTreeNode<T> * root) {//二叉树先序遍历算法(递归版)
    if (!root) return;
    cout << root->data;
    travPre_R(root->LeftChild);
    travPre_R(root->RightChild);
}

中序遍历

代码如下:

template <typename T>
void travIn_R(BinTreeNode<T> * root) {//二叉树先序遍历算法(递归版)
    if (!root)
        return;
    travPre_R(root->LeftChild);
    cout << root->data;
    travPre_R(root->RightChild);
}

1.8采用递归和非递归对二叉树进行遍历?

这道题想考察什么?

1、二叉树的基本原理和遍历的方法?

考察的知识点

二叉树遍历的基本概念、二叉树的基本原理

考生如何回答
二叉树的基本概念

简单地理解,满足以下两个条件的树就是二叉树:

  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

在这里插入图片描述

二叉树的遍历
  • 前序遍历:每个树的遍历顺序为:根节点→左节点→右节点。上图的前序遍历输出为:FCADBEHGM
  • 中序遍历:每个树的遍历顺序为:左节点→根节点→右节点。上图的前序遍历输出为:ACBDFHEMG
  • 后序遍历:每个树的遍历顺序为:左节点→右节点→根节点。上图的前序遍历输出为:ABDCHMGEF

前序遍历

递归法:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private List<Integer> res = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        //中 ——> 左 ——> 右
        preorder(root);
        return res;
    }
    
    private void preorder(TreeNode node){
        if(node == null) return;
        res.add(node.val);
        preorder(node.left);
        preorder(node.right);
    }
}

非递归法:
===基本的算法思想===
创建一个栈,用来储存遍历的轨迹:
1.如果栈不为空则储存当前栈顶元素的值,并弹栈;
2.如果栈顶元素存在右儿子,将右儿子压入;
3.如果栈顶元素有左儿子,将左儿子压入
4.重复1直至栈为空
    
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            if(cur != null){
                res.add(cur.val);
                stack.push(cur);
                cur = cur.left;
            }else{
                cur = stack.pop();
                cur = cur.right;
            }
        }
        return res;
    }
} 

中序遍历

递归法:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private List<Integer> res = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return res;
    }
    
    public void inorder(TreeNode node){
        if(node == null) return;
        inorder(node.left);
        res.add(node.val);
        inorder(node.right);
    }
}

非递归法:
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            //压栈
            if(cur != null){
                stack.push(cur);
                cur = cur.left;
            }else{
                //左边已经存完,弹栈
                cur = stack.pop();
                res.add(cur.val);
                cur = cur.right;
            }
        }
        return res;
    }
}

后序遍历

递归法:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private List<Integer> res = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
        //左右中
        postorder(root);
        return res;
    }
    
    private void postorder(TreeNode node){
        if(node == null) return;
        postorder(node.left);
        postorder(node.right);
        res.add(node.val);
    }
}

非递归法:
基本的算法思想:
使用栈来记录遍历轨迹,并使用一个变量来储存上一次方法的元素,当当前元素左右儿子为空或当前元素已经在上一轮访问过(即上一次方法访问的元素为当前访问元素的节点),则栈顶元素出栈。
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;
        stack.push(root);
        
        while(!stack.isEmpty()){
            TreeNode cur = stack.peek();
            if((cur.left == null && cur.right == null)
              || (pre != null && (cur.right == pre || cur.left == pre))){
                res.add(cur.val);
                pre = cur;
                stack.pop();
            }else{
                if(cur.right != null) stack.add(cur.right);
                if(cur.left != null) stack.add(cur.left);
            }
        }
        
        return res;
    }
}

文末

更多的Android面试题可以扫描免费领取!

↓↓↓【预览】↓↓↓

img

二叉树面试题 这个demo里面主要介绍了有关二叉树的算法面试题,希望可以帮助需要的同学. 立即下载

相关推荐

android实现二级思维导图、二叉树、二级表图

android实现二级思维导图、二叉树、二级表图,用动态添加布局实现,项目开发需要 可实现点击事件的处理,但是只有二级分类,多级分类暂时没有实现

【Android面试】2023最新面试专题三:二叉树篇

请说一说HashMap实现原理,扩容的条件,链表转红黑树的条件是什么 ? 这道题想考察什么? 1、HashMap的底层原理? 2、HashMap的扩容条件以及链表转换红黑树的条件

datian1234的博客 377

Protege本体建模实战:从零构建电影知识图谱并导入Neo4j

本体建模是知识图谱构建的基石,通过类、属性、实例和约束系统描述领域知识,为数据提供可复用的语义骨架。OWL作为本体描述语言的标准,配合Protege工具可实现可视化建模,并借助推理机验证逻辑一致性,提升模型可靠性。在工程落地中,本体模型常需导入图数据库如Neo4j,以支持高效的关联查询与业务应用。本文以影视领域为背景,完整演示Protege中定义类层级、创建对象/数据属性、填充实例,以及导出OWL文件并通过Python脚本转换为Neo4j节点与关系的全过程,同时梳理命名空间、匿名节点、编码等易踩坑点,帮助读

weixin_29047545的博客 281

Android 二叉树理解

二叉树的性质 如果有2个子节点,那么左侧的比它本身的值小,右侧的比它本身的值大 查找: 查找过程: 19小于33,则查找子左节点:17; 19大于17,则查找子右节点18; 因为19大于18,则继续找子右节点25; 因为19小于25,则查找左节点19; 等于了,说明我们找到了; 插入 插入过程: 55大于33,则往子右节点查找,即50; ...

简公子的博客 2298

Unity IAP插件实战:从零搭建Google Play内购系统

本文详细介绍了如何使用Unity IAP插件从零搭建Google Play内购系统,涵盖环境准备、双端配置、核心API实现及常见问题排查。通过实战代码示例,帮助开发者快速掌握跨平台内购功能开发,提升手游商业化效率。

weixin_28692867的博客 430

STK12与Python联合仿真(一):环境搭建

STK仿真python接口,安装与测试

qq_42635142的博客 1万+

二叉树的前、中、后序遍历与层序遍历

前、中、后序及层序遍历二叉树

m0_67683346的博客 1万+

【UE5】Vosk插件实战:离线语音识别与TTS朗读全流程解析

本文详细解析了如何在UE5中利用Vosk插件实现离线实时语音转文字功能。从环境配置、插件与模型准备,到核心C++组件封装与蓝图系统搭建,提供了完整的实战教程。重点解决了离线语音识别在游戏开发中的延迟、隐私和网络依赖问题,并演示了从语音识别到TTS朗读的完整交互闭环,为开发安全、实时的语音交互应用提供可靠方案。

weixin_29021291的博客 510

android自定义绘制二叉树,安卓数据结构04-二叉树

数据结构04-二叉树一、树的基本概念1.树树是n(n>=0)个节点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根(Root)的节点;当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、......、Tm,其中每一个集合本事又是一颗树,并且称为根的子树(SubTree)。2.度节点的度是节点拥有的子树数。度为0的节点称为叶子节点或终端节点,...

weixin_32540913的博客 330

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3243

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1258

【算法总结】你真的掌握了二叉树的遍历嘛,最新Android面试合集

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

2401_83946261的博客 772

YOLO26原创自研: 魔改Bottleneck,具备多尺度和特征通道融合的结构

魔改Bottleneck,具备多尺度和特征通道融合的结构,该模型在检测准确性方面都取得了良好的效果,尤其在缺陷检测方向。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 315

Android知识点及面试题(2022年Android中高级面试题汇总)

如今安卓开发不像前几年那么热门,但是高级人才依然紧缺,大家看着这句话是不是很熟悉,因为 web 高级人才也紧缺,c++ 高级人才一样紧缺,那么到了人工智能时代,人工智能时代的高级人才也同样会紧缺!似乎是高级人才的人在其他领域也是高级人才,而不是因为选择了热门才会一帆风顺。 我们到底应该学什么才能有效地提高自身的竞争力呢? 首先我们应该优先深入学习工作中用到的技术,其次,关注这2年来Android最新的面试题所涉及的知识点,根据自身的实际情况有选择地进行针对性的学习和提升。只有这样,自身才不会被所谓的互联网寒

Android_XG的博客 1782

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3814

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

46道面试题带你了解中高级Android面试,深度好文_中高级android面试题

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗加入社区》https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)]喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗。

2401_87029864的博客 1380

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2019大厂Android高级面试题汇总

前言 金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。正好我电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)高...

我的博客 3390

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

888道Android高级面试题,快手安卓面试题

知道哪些混合开发的方式?说出它们的优缺点和各自使用场景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的了解一些前端js等还是很有好处的);ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?如果在onStop的时候做了网络请求,onResume的时候怎么恢复?点击事件被拦截,但是想传到下面的View,如何操作?ListView 中图片错位的问题是如何产生的?

2401_85030470的博客 829

2019 BAT等大厂Android高级面试题汇总

热文导读|点击标题阅读如何才能成为优秀的架构师?Android组件化之实现模块 API 化重磅!Android Studio 3.4 稳定版发布,新特性全总结!作者...

Java和Android架构 2212

Android高级UI面试题汇总(含详细解析 十)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊👀你想要的面试题这里都有👀👇👇👇。

Misdirection_XG的博客 157

金三银四热潮下。Android高级工程师面试题整理

最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是"走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨",做好全栈的装备。 前言 金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。正好我电脑里面有这方面的整理,于是...

Android_SE的博客 1622

金三银四,2019大厂Android高级工程师面试题整理+进阶资料

金三银四,很多同学心里大概都准备着年后找工作或者跳槽。最近有很多同学都在交流群里求大厂面试题。正好我电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 主要分为以下几部分: (1)java面试题...

weixin_34301132的博客 921

androidstudio插件,2024Android高级面试题及答案

【Android 详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

2301_82243396的博客 861

2024年安卓最全史上最全的互联网大公司100+-Android面试题助你冲关金九银十!,把面试官鸽了

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后如何才能让我们在面试中对答如流呢?答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。

2401_84556528的博客 721

金三银四,2019大厂Android高级工程师面试题整理

最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是"走上编程之路,将来你要学不仅仅是这些,丰富自己方能与世接轨",做好全栈的装备。 原文地址:游客kutdfkmvbwk2shttps://yq.aliyun.com/users/k...

weixin_33967071的博客 271

Android高级工程师面试题整理

这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)高级开发技术面试题 (4)跨平台Hybrid 开发 一、java面试题 熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api...

weixin_30896763的博客 546
上一篇: Android高级面试题详解之HashMap实现原理
下一篇: Android高级面试题详解之MD5的原理
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值