剑指 offer 笔记 38 | 二叉树的深度
2019-11-10 本文已影响0人
ProudLin
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路分析
1)如果一棵树只有一个结点,它的深度为 1。
2)如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加 1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加 1。
3)如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加 1。
所以可以用递归的方式来实现。
解释说明:
public class Solution {
public int TreeDepth(TreeNode root) {
//递归的出口,root为0则返回0,这里可以理解为root为0那肯定没有层数了
if(root == null){
return 0;
}
//拿到左子树的最大深度
int nLeft = TreeDepth(root.left);
//拿到右子树的最大深度
int nRight = TreeDepth(root.right);
//找出最大值,并且加上 root 这一层即可
int depth = (nLeft > nRight)?(nLeft + 1):(nRight + 1);
return depth;
}
}
关于递归的我有点看不懂,于是我去查看了一些资料:https://blog.csdn.net/weixin_38383877/article/details/89363080
非递归方式
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null) {
return 0;
}
Queue<TreeNode> q=new LinkedList<TreeNode>();
q.add(root);
int d=0,count=0,nextcount=q.size();
while(q.size()!=0) {
TreeNode t=q.poll();
count++;
if(t.left!=null) {
q.add(t.left);
}
if(t.right!=null) {
q.add(t.right);
}
if(count==nextcount) {
d++;
count=0;
nextcount=q.size();
}
}
return d;
}
}
参考《剑指offer》 第 2 版 P272