摘要:

今天翻到了《剑指offer》面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造。然而我翻了下别人的java版本(我就想看看有什么高大上的改造,毕竟要传递多个参数,是不是会涉及到那么一点点设计模式呢?),简直不能忍了,我只能用一句话形容:“一本正经的胡说八道”,不过我就是喜欢看你胡说八道还迷之自信的样子。

下面吐槽一下这个版本的java代码:

1 //高效率的判断是否是一棵平衡二叉树

2 public booleanisBalanced2(BinaryTreeNode root){3 int depth = 0;4 returnisBalanced2(root,depth);5 }6 public boolean isBalanced2(BinaryTreeNode root,intdepth){7 if(root == null){8 depth = 0;9 return true;10 }11 int left = 0,right = 0;12 if(isBalanced2(root.leftNode,left) &&isBalanced2(root.rightNode,right)){13 int diff = left-right;14 if(diff <= 1 && diff >= -1){15 depth = 1+(left > right?left : right);16 return true;17 }18 }19 return false;20 }

这个文章的原始链接我就不发了,保留一点人品。关键是特么CSDN竟然把他作为百度搜索第一条置顶了,可见人气是最高的,看看作者发帖历史(好像还有那么一点小屌),我TM差点就信了。这个哥们连函数参数的复制传值都不懂啊!怎么学的编程,还发帖误导广大小学生,简直不能忍。我看也不用参考别人的代码了,自己写一个吧。

原题一:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根,叶子结点)形成一条路径,最长路径的长度为树的深度。

输入样例:

1

2     3

4   5     6

7

源代码:

classBinaryTreeNode{public intdata;publicBinaryTreeNode left;publicBinaryTreeNode right;publicBinaryTreeNode(){

data= 0;

left= null;

right= null;

}

}public classQuestion_39 {//----递归求二叉树深度----

public static inttreeDepth(BinaryTreeNode root){if(root == null){return 0;

}int left =treeDepth(root.left);int right =treeDepth(root.right);return (left>right)?(left+1):(right+1);

}public static voidmain(String[] args) {//TODO Auto-generated method stub

BinaryTreeNode node1 = newBinaryTreeNode();

BinaryTreeNode node2= newBinaryTreeNode();

BinaryTreeNode node3= newBinaryTreeNode();

BinaryTreeNode node4= newBinaryTreeNode();

BinaryTreeNode node5= newBinaryTreeNode();

BinaryTreeNode node6= newBinaryTreeNode();

BinaryTreeNode node7= newBinaryTreeNode();

node1.data= 1;

node2.data= 2;

node3.data= 3;

node4.data= 4;

node5.data= 5;

node6.data= 6;

node7.data= 7;

node1.left=node2;

node1.right=node3;

node2.left=node4;

node2.right=node5;

node5.left=node7;

node3.right=node6;

System.out.println("递归求二叉树深度: "+treeDepth(node1));

}

}

这道题比较简单,没什么好说的。

题目二:输入一颗二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。

方法一:需要重复遍历多次的解法,简单但不足以打动面试官

1 public static booleanisBalanced_1(BinaryTreeNode root){2 if(root==null){3 return true;4 }5 int left =treeDepth(root.left);6 int right =treeDepth(root.right);7 int diff = left -right;8 if(diff>1||diff

该方法简洁,但是一个结点会被重复遍历多次,时间效率不高。

方法二:每个结点只遍历一次,面试官喜欢

1 classTuple{2 private booleanisBalanced;3 private intdepth;4

5 publicTuple(){}6 public Tuple(boolean isBalanced, intdepth) {7 super();8 this.isBalanced =isBalanced;9 this.depth =depth;10 }11 //-----isBalanced,Getters and Setters----

12 public booleangetIsBalanced() {13 returnisBalanced;14 }15 public void setIsBalanced(booleanisBalanced) {16 this.isBalanced =isBalanced;17 }18 //-----depth,Getters and Setters----

19 public intgetDepth() {20 returndepth;21 }22 public void setDepth(intdepth) {23 this.depth =depth;24 }25

26

27 }28 //----判断平衡二叉树,每个结点只遍历一次----

29 private staticTuple isBalanced(BinaryTreeNode root){30 if(root==null){31 Tuple tuple = newTuple();32 tuple.setIsBalanced(true);33 tuple.setDepth(0);34 returntuple;35 }36 Tuple left =isBalanced(root.left);37 Tuple right =isBalanced(root.right);38

39 if(left.getIsBalanced()&&right.getIsBalanced()){40 int diff = left.getDepth()-right.getDepth();41 if(diff<=1&&diff>=-1){42 return new Tuple(true,(left.getDepth()>right.getDepth()?left.getDepth():right.getDepth()) + 1);43 }44 }45 return new Tuple(false,-1);46 }47 public static booleanisBalancedBinaryTree(BinaryTreeNode root){48 Tuple tuple =isBalanced(root);49 returntuple.getIsBalanced();50 }

在上面的代码中,我们使用后序遍历的方式遍历整颗二叉树。在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度。当遍历到根结点的时候,也就判断了整颗二叉树是不是平衡二叉树。由于要传递两个参数,一般的使用返回值的方法是行不通的,而且Java并不存在指针和简单数据类型的引用传值。一般的高级语言(如Python)会有元组这么一个概念(Java没有那就自己定义一个),既然只能返回一个值,那就返回一个复合类型的,函数改造完成~

我想说的是,每个入了门的程序员都知道参数是复制传值,在C/C++中只能用指针和引用的方式从参数列表中传递或获取值,在Java中,除了基本数据类型和String类型外,也是引用传值。但是基本数据类型传进函数体你改动了有什么意义?你只是改动了一个副本。为了呵护祖国下一代程序员的健康成长,老夫专门抽时间写了一篇博客(抠鼻),打击不良之风~  本来想和平衡二叉树结合一起写一篇文章,但是平衡二叉树TMD代码一下子要写500多行,我表示受到了惊吓,有机会再说吧

二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)相关推荐

  1. python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法

    Q10.斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项. 解题思路 思路一 递归 递归很简单但是并不能AC python实现代码 class Solution: def Fibon ...

  2. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  3. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  4. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  5. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  6. java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...

  7. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  8. python剑指offer面试题_剑指Offer(Python语言)面试题38

    面试题38:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca和cba. # - ...

  9. 面试mysql慢查询_剑指Offer面试题:如何定位并优化慢查询sql

    1.根据慢日志定位慢查询sql 使用以下命令查看相关系统变量属性: show variables like '%query%'; 主要看这三个属性: long_query_time : 10.0000 ...

  10. 【LeetCode】剑指 Offer 28. 对称的二叉树

    [LeetCode]剑指 Offer 28. 对称的二叉树 文章目录 [LeetCode]剑指 Offer 28. 对称的二叉树 一.递归 一.递归 对称二叉树定义:对于书中任意两个对称结点 L 和 ...

最新文章

  1. linux 网卡配置详情
  2. origin中文版散点图拟合曲线_「测试狗」Origin入门教程:如何进行单段及多段线性拟合...
  3. USACO-Section1.4 Barn Repair (贪心算法)
  4. 解决Android学习之ScollView嵌套ListView和GridView问题
  5. 终于搞定了cxgrid的多行表头(转终于搞定了cxgrid的多行表头 )
  6. 大众点评优略点评。。
  7. 天玥运维安全网关(启明星辰堡垒机)无法登录资源主机的问题
  8. 【示波器专题】示波器带宽对测量的影响
  9. 拳王虚拟项目公社:建一个虚拟资源流量池,兼职副业卖虚拟资源商品月入5000
  10. LINUX——正则表达式
  11. linux彻底卸载nginx,linux彻底删除nginx
  12. java扫雷布雷算法_扫雷的布雷算法
  13. 行政科购入计算机一台,行政单位会计分录练习题.doc
  14. Think in automotive Ethernet Topology
  15. 鲁大师发布Q1手机性能榜,ROG5幻影夺冠,超过93万分!
  16. 杰理之ANC喇叭腔体设计【篇】
  17. GoogleVR怎样在普通场景和VR场景之间进行切换
  18. Stimulsoft Forms.WEB 23.2.6 Crack
  19. 这可能是最全面的Java学习路线了
  20. linux的fq软件github,曾经霸榜 GitHub:漂亮开源的 Linux 资源监视工具

热门文章

  1. 47 APScheduler安装及基本概念
  2. signature=60e238a971088f65081a607ed25e04b3,Healthcare Claims Loss Control Systems And Methods
  3. laravel ajax login,设置在ajax上记住laravel登录
  4. python采用函数式编程模式吗_Python函数与函数式编程
  5. android判断以太网还是wifi,对比平台--WiFi和以太网之间的区别
  6. 车辆动力学及控制pdf_Simulink软件仿真平台之车辆模型
  7. Selenium3自动化测试——9.多窗口切换
  8. 一文简单弄懂tensorflow_【TensorFlow】一文弄懂CNN中的padding参数
  9. c++连连看游戏_用Python玩连连看是什么效果?
  10. python2.0教程_django2.0入门教程第一节