当前位置: 首页 > 后端技术 > Java

LeetCode刷题-我会翻转二叉树,谷歌还要我吗?

时间:2023-04-01 19:49:08 Java

解决方案代码/***二叉树节点的定义。*公共类TreeNode{*intval;*左边的树节点;*正确的树节点;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,TreeNoderight){*this.val=val;*this.left=左;*this.right=正确;*}*}*/classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null){//如果树节点为空,直接返回nullreturnnull;}//使用递归,把树看成根节点、左孩子、右孩子的一个整体,将根节点作为一个整体翻转如果左孩子和右孩子也是树,那么递归执行同样的方法直到左孩子和右孩子都为空,递归开始回溯//得到根节点TreeNode的左孩子left=invertTree(root.left);//根节点的左孩子等于右孩子,右孩子等于左孩子,实现反转root.left=invertTree(root.right);root.right=左;//返回倒置的根节点returnroot;}}提交结果执行时间为0ms,时间跑赢了100.00%的用户,内存消耗35.9MB,空间跑赢了37.33%的用户。原来翻转二叉树这么简单,我就翻转一棵二叉树,谷歌还要我吗?扩展分析不过我写题的时候会把完整的代码写出来。以上显然不是完整的代码。当我们执行操作时,输入是一个数组,输出也是一个数组,如图:而invertTree方法本质上输入的是一个二叉树TreeNode对象,所以实际上有一个输入过程将一个数组转为二叉树,以及将二叉树转回数组的输出过程。LeetCode后台在LeetCode上写题的时候已经帮你做了转换,但是如果我们要自己写完整的代码,就需要自己做转换了。这里只给出一个数组来确定二叉树,证明是层序遍历,因为前序遍历、中序遍历和后序遍历不能从单个数组中推导出二叉树,而层序遍历顺序遍历只能从单个数组导出二叉树。层序遍历:从上到下逐层访问所有节点,每一层从左到右。为了便于理解,这里举几个例子:输入数组1:[0,null,2,null,4,null,6]输出二叉树1:输入数组2:[1,null,2,3]输出二叉树2:输入数组3:[0,1,null,null,4]输出二叉树3:输入数组4:[4,2,7,1,3,6,9]输出二叉树4:数组转二叉tree:有点奇怪,看了很多算法书,查阅了很多网上资料,很少看到怎么把按顺序遍历的数组转换成二叉树。下面我整理了一个转换方法。请看arrayToTreeNode方法背后的完整代码,通过队列辅助实现广度优先搜索,即在遍历层级时模拟从上到下、从左到右的过程,将数组转换为二叉树。注意考虑数组元素为null的情况,当数组元素为null时,该节点没有子节点,但它自己占据了一个数组元素。二叉树转数组:完整代码请看下面的treeNodeToArray方法,也是通过队列辅助实现广度优先搜索,即在遍历层时模拟从上到下,从左到右的过程,先将二叉树转化为一个二层列表List,二层列表的每一层保存一层树从左到右的节点值,最后将二层列表List转为数组。这里,还要注意数组元素为null的情况。如果一行元素全为null,则不需要这一行;如果一行的最后一个元素为空,则应删除最后一个元素。完整代码如下:importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){//获取输入结果Scannerscanner=newScanner(System.in);字符串str=scanner.next();扫描仪.close();//处理输入结果Integer[]nums;if("[]".equals(str)){//当数组为空时nums=null;}else{//当数组不为空时String[]strs=str.split("\\[")[1].split("]")[0].split(",");intsize=strs.length;nums=新整数[大小];对于(inti=0;i>list=newArrayList<>();if(root==null){//如果二叉树节点为空,直接返回一个空数组returnnewInteger[0];}//通过队列辅助,从上到下完成每一层的遍历。遍历每一层的时候,遍历完一个节点后,判断这个节点的两个孩子,如果节点不为空,就把孩子节点放在队列后面。队列保证树按照层级从上到下遍历,每一层从左到右遍历。//定义队列Queuequeue=newLinkedList<>();//先将二叉树的根节点放入队列,最后queue.add(root);//循环直到队列长度为零,结束循环while(queue.size()>0){//定义内层列表,保存内层结果Listtemp=newArrayList<>();//获取队列的长度intsize=queue.size();//遍历队列,每次遍历完成一层树节点的遍历for(inti=0;i