目录

题目:

解答:

博主笨拙的想法——些许暴力

思路:

非常妙的方法:


题目:

对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果。

每行输入为一个二叉树,一维数组形式。其中-1表示Nil节点,例如:1,7,2,6,-1,4,8 构成的二叉树如下图所示:

结果以二维数组形式输出(前序,中序,后序遍历的结果),其中Nil节点不用输出。 

输出示例:

代码编写:核心代码模式:

import java.util.*;public class Solution {/*** 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果* @param input int整型一维数组 -1表示Nil节点* @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> binaryTreeScan (int[] input) {// write code here}
}

解答:


博主笨拙的想法——些许暴力

思路:

  • 对于普通的二叉树的前序、中序、后序遍历,想必大家都是可以轻松拿捏的,所以博主从这里入手思考的,我只要利用这个数组,构造出一棵二叉树,就可以将这道题,轻松解答
  • 现在,开始思考,如何讲该数组,构造出一棵二叉树
  1. 特殊情况,特殊考虑

    input.length==0||input[0]==-1,直接返回空
    
  2. 利用队列,记录二叉树的节点,代码里面有更详细的解释:
    //构建二叉树public static TreeNode fun(int[] input) {//特殊情况if(input.length==0||input[0]==-1) {return null;}//数组长度int n = input.length;Queue<TreeNode> queue = new LinkedList<>();TreeNode root = new TreeNode(input[0]);//将根节点先放进去queue.add(root);for(int i = 1;i<n;i++) {//如果队列为空并且数组并没有走完,代表数组后面的值其实是无效值,这里不好理解的话,你可以自己随便画一个一组,看看,下面我也画了一组,可以看看(代码后面)if(queue.isEmpty()) break;TreeNode cur = queue.poll();//左节点if(input[i]==-1) {cur.left=null;} else {cur.left = new TreeNode(input[i]);queue.add(cur.left);}//右节点i++;if(i<n) {if(input[i]==-1) {cur.right=null;} else {cur.right = new TreeNode(input[i]);queue.add(cur.right);}} else {break;}}return root;}

代码中为什么说他是无效值?

二叉树都构造出来了,后面就很简单啦!不解释啦 ~

上代码:

import java.util.*;
public class Solution {/*** 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果* @param input int整型一维数组 -1表示Nil节点* @return int整型ArrayList<ArrayList<>>*/public  ArrayList<ArrayList<Integer>> binaryTreeScan (int[] input) {// write code hereArrayList<ArrayList<Integer>> ret = new ArrayList<>();//if(input.length==0||input[0]==-1) return ret;TreeNode root = fun(input);ret.add(preOrder(root));ret.add(vinOrder(root));ret.add(lastOrder(root));return ret;}//构建二叉树public  TreeNode fun(int[] input) {if(input.length==0||input[0]==-1) {return null;}int n = input.length;Queue<TreeNode> queue = new LinkedList<>();TreeNode root = new TreeNode(input[0]);queue.add(root);for(int i = 1;i<n;i++) {if(queue.isEmpty()) break;TreeNode cur = queue.poll();if(input[i]==-1) {cur.left=null;} else {cur.left = new TreeNode(input[i]);queue.add(cur.left);}i++;if(i<n) {if(input[i]==-1) {cur.right=null;} else {cur.right = new TreeNode(input[i]);queue.add(cur.right);}} else {break;}}return root;}//先序遍历public  ArrayList<Integer> preOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}ret.add(root.val);ret.addAll(preOrder(root.left));ret.addAll(preOrder(root.right));return ret;}//中序遍历public  ArrayList<Integer> vinOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}ret.addAll(vinOrder(root.left));ret.add(root.val);ret.addAll(vinOrder(root.right));return ret;}//后序遍历public  ArrayList<Integer> lastOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}ret.addAll(lastOrder(root.left));ret.addAll(lastOrder(root.right));ret.add(root.val);return ret;}
}

但是,这这这,他通过率只有百分之六十,博主绞尽脑汁,也没发现问题,呜呜呜呜~

于是乎,我就这样交卷了,交卷后,我去牛客上找到原题,将上述代码,提交了一遍,发现了问题所在,可真是为难到我了,测试不通过:

你发现问题了吗?

画个图来瞅瞅:

根据人家的预期输出结果,发现了思路应该是这样的:

哈哈哈,有没有被我误导了,真不好意思,哈哈哈哈哈哈!!!

因此,更改代码,在构建二叉树时,遇到-1值,也需要往队列里面放,只不过在前、中、后序遍历时,遇到-1,不记录而已~

上代码:

import java.util.*;public class Solution {/*** 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果* @param input int整型一维数组 -1表示Nil节点* @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> binaryTreeScan (int[] input) {// write code hereArrayList<ArrayList<Integer>> ret = new ArrayList<>();// if(input.length==0||input[0]==-1) return ret;TreeNode root = fun(input);ret.add(preOrder(root));ret.add(vinOrder(root));ret.add(lastOrder(root));return ret;}//构建二叉树public TreeNode fun(int[] input) {if(input.length==0||input[0]==-1) {return null;}int n = input.length;Queue<TreeNode> queue = new LinkedList<>();TreeNode root = new TreeNode(input[0]);queue.add(root);for(int i = 1;i<n;i++) {if(queue.isEmpty()) break;TreeNode cur = queue.poll();cur.left = new TreeNode(input[i]);queue.add(cur.left);i++;if(i<n) {cur.right = new TreeNode(input[i]);queue.add(cur.right);} else {break;}}return root;}//先序遍历public ArrayList<Integer> preOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}if(root.val!=-1) ret.add(root.val);ret.addAll(preOrder(root.left));ret.addAll(preOrder(root.right));return ret;}//中序遍历public ArrayList<Integer> vinOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}ret.addAll(vinOrder(root.left));if(root.val!=-1)ret.add(root.val);ret.addAll(vinOrder(root.right));return ret;}//后序遍历public ArrayList<Integer> lastOrder(TreeNode root) {ArrayList<Integer> ret = new ArrayList<>();if(root == null) {return ret;}ret.addAll(lastOrder(root.left));ret.addAll(lastOrder(root.right));if(root.val!=-1)ret.add(root.val);return ret;}
}

非常妙的方法:

如果根节点从0开始编号,对于任意一个节点i,其左孩子编号为2*i+1,右孩子编号为2*i+2,有了这个关系,就能够通过递归求得三种遍历序了

不理解?好的,普及一下二叉树的一些性质,很重要哦!

  • 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 (i>0)个结点
  • 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)
  • 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0n21 具有n个结点的完全二叉树的深度k上取整
  • 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i 的结点有
        若i>0,双亲序号:(i-1)/2i=0i为根结点编号,无双亲结点
        若2i+1<n,左孩子序号:2i+1,否则无左孩子
        若2i+2<n,右孩子序号:2i+2,否则无右孩子

不太理解?你只看文字当然不理解啦,动手画画!就知道了

好了,回到正题了,上代码咯!!!

import java.util.*;public class Solution {/*** 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果* @param input int整型一维数组 -1表示Nil节点* @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> binaryTreeScan (int[] input) {// write code hereArrayList<ArrayList<Integer>> res = new ArrayList<>();res.add(preOrder(input, 0));res.add(inOrder(input, 0));res.add(postOrder(input, 0));return res;}//前序遍历private ArrayList<Integer> preOrder(int[] nums, int root) {ArrayList<Integer> ret = new ArrayList<>();if(root >= nums.length){return ret;}if(nums[root] != -1){ret.add(nums[root]);}//位运算提高效率ret.addAll(preOrder(nums, (root << 1)|1));ret.addAll(preOrder(nums, (root << 1) + 2));return ret;}//中序遍历private ArrayList<Integer> inOrder(int[] nums, int root) {ArrayList<Integer> ret = new ArrayList<>();if(root >= nums.length){return ret;}ret.addAll(inOrder(nums, (root << 1)|1));if(nums[root] != -1){ret.add(nums[root]);}ret.addAll(inOrder(nums, (root << 1) + 2));return ret;}//后序遍历private ArrayList<Integer> postOrder(int[] nums, int root) {ArrayList<Integer> ret = new ArrayList<>();if(root >= nums.length){return ret;}ret.addAll(postOrder(nums, (root << 1)|1));ret.addAll(postOrder(nums, (root << 1) + 2));if(nums[root] != -1){ret.add(nums[root]);}return ret;}
}

好啦!今天就这儿咯!!!

58同城2021校招笔试——二叉树遍历相关推荐

  1. 58同城2021校招笔试-二叉树遍历

    对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果. 每行输入为一个二叉树,一维数组形式.其中-1表示Nil节点,例如:1,7,2,6,-1,4,8 构成的二叉树如下图所示: 结果以二维数组形 ...

  2. 58同城2021校招笔试真题-前端

    58同城2021校招笔试-前端 以下代码输出: console.log([1,2,3,4,5].splice(1,2,3,4,5)); console.log([1,2,3,4,5].slice(1, ...

  3. 【牛客网-公司真题-前端入门篇】——58同城2021校招笔试-前端

  4. 58同城2015校招笔试、一面、二面经历

    原文:http://www.dy1280.com/thread-878-1-1.html 10.18 宣讲 58宣讲时间真是安排的晚...19.30开始,我6.30就到了..整整放了1个小时不重复的视 ...

  5. 58同城 2021校招 测试岗

    9.18 一面 40分钟 面试官很和蔼还为她的迟到道歉 自我介绍 项目介绍基于项目问了很多 做这两个项目的背景是什么,为什么做 在你的项目团队中如果存在一个人10天才能完成,大家都是5天完成怎么解决这 ...

  6. 58同城2020校招转转算法岗笔试编程题

    58同城2020校招转转算法岗笔试编程题 第一题 题目描述:年末了要评选优秀员工了,给定一个优秀员工比率,在员工的评分上计算出能被选中的优秀员工的评分阈值.优秀员工人数=员工人数*优秀员工比率.员工人 ...

  7. 网易2021校招笔试

    网易2021校招笔试 第一题 第二题 第三题 第四题 第五题 第六题 第一题 Comparable和Comparator区别是什么? 1.comparable接口实际上是出自java.lang包,它有 ...

  8. 凑硬币(58同城2017校招笔试题)

    凑硬币(58同城2017校招笔试题) 暴力破解,循环递归实现,代码如下: /** * 暴力破解,循环递归,找出了所有可能的组合并进行了存储,* 在循环递归的时候,因为选取的分类相互是有重叠的,生成的递 ...

  9. 面经 | bigo/联影/58同城20校招计算机视觉算法岗

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:蜂蜜柠檬百香果 来源:https://www.now ...

最新文章

  1. 深度学习技术在美图个性化推荐的应用实践
  2. mssql 查询当前自增序号_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  3. 更换YUM及升级包方法
  4. ios UIWebView 播放优酷土豆视频
  5. 《Hadoop MapReduce实战手册》一1.4 给WordCount MapReduce程序增加combiner步骤
  6. python判断数据是否在另一个集合中_python判断一个集合是否包含了另外一个集合中所有项的方法...
  7. linux wait函数头文件_第五十八章、linux中的3种正常结束进程的方式你都了解么...
  8. CodeForces 292D Connected Components (并查集+YY)
  9. Linux内核分析学习路线总结(内核人员必看)
  10. VLAN与Trunk的原理及配置
  11. adb shell dumpsys activity activities调用信息分析
  12. LWIP应用开发|DNS域名解析
  13. Python 爬虫学习笔记(十(2))scrapy爬取图书电商实战详解
  14. mac怎么查node版本_node版本管理的正确打开方式(mac)
  15. UML统一建模语言第4章 用例和用例图课后习题
  16. Linux板子RTC时间设置和修改
  17. 未能加载文件或程序集xxxx,系统找不到指定的文件
  18. 数字孪生应用于智慧楼宇、园区场景数字化系统建设
  19. 物联网智能时代下电子工程师的出路
  20. 怎么在c语言中输入一串字母,C语言中如何输入一个数字n,再输入一串字母,控制字母个数为n(n是变量,1...

热门文章

  1. java插入数据到mysql数据库
  2. 安mysql一直转圈_在访问数据库时没报错一直转圈,mysql版本不同的连接方式
  3. 进销存免费管理软件 进销存免费软件推荐 免费进销存
  4. 安装python 脚本初稿
  5. 嵌入式linux开发ubuntu下常用操作
  6. 《惊天魔盗团》—电影随评
  7. 利用R语言预测银行客户信用的优劣(随机森林方法)
  8. 让自己网站对接google谷歌第三方登录接口详解说明
  9. 学而时习之,不亦说乎
  10. YouTube-8M 数据集简介