今日的第二道题目,互相监督,互相学习哦~~上题:
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
分析:求二叉树的长度,当然要挨个遍历,得到最长的一个路径长度;
二叉树是分左子树和右子树,左子树又再分左右子树,所以可以用递归实现;
代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null){
return 0;
}
int left=TreeDepth(root.left); //不断的迭代找他左子树
int right=TreeDepth(root.right);//不断迭代找到右子树
return Math.max(left,right)+1; //找出其中大的一个,返回。
}
}
牛客运行通过
运行时间:20ms
运行内存:9372Kb
一定要很好的理解递归这一个概念,不断的递归下去,到底之后,在执行下面的语句后返回。
方法二:非递归实现
代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
public class Solution {
public int TreeDepth(TreeNode root){
if(root == null)return 0;
ArrayList<TreeNode> level = new ArrayList<TreeNode>();
level.add(root); //记录最上面一层的节点,即根节点
int result = 0; //记录层数,层数及时最大路径数
while(level.size()>0){
result = result +1;
ArrayList<TreeNode> newLevel = new ArrayList<TreeNode>();//作为中间变量,存放每一层节点
for(int i = 0; i < level.size();i++){//通过遍历将每一层的节点添加到newLevel中
if(level.get(i).left != null)newLevel.add(level.get(i).left);
if(level.get(i).right != null)newLevel.add(level.get(i).right);
}
level = newLevel; //将得到的新的一层作为新的根节点返回。
}
return result;
}
}
牛客运行通过
运行时间:18ms
运行内存:9396Kb
二叉树其实用递归比较好,因为他只要左子树或者右子树,不断迭代到底就可以了;
递归很多人想不明白,如果递归的函数带有return,它其实是先进行递归,最后在递归结束后再运行递归后面的程序,一层一层的进行返回,知道最初的一层。不懂递归的可以搜索看一下,或者看斐波那契数列,这是最基本的一个递归实现,也比较好理解。
非递归相对递归比较麻烦,但是比递归要好理解,比较符合我们正常的逻辑思维;
欢迎各位互相交流哦~~