版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012429555/article/details/89475803
/**
* 输入一棵二叉树,求该树的深度。
* 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
*/
思路一: 先看递归遍历
public class TreeDepth {
/**
* 递归版本
*/
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;
}
说实话,第一眼我也没看懂这个操作,但是稍微一想,你们其实在做递归的时候,你们就像想成一个
当遍历到叶子节点的时候,那个int就有值了,就会自动返回1.这样就会累计了。
说实话,递归好烦,看的人烦。
思路儿:层次遍历
就是用队列,层次遍历树,依次的去depth++;
/**
* 非递归,层序遍历
* @param args
*/
public int depth(TreeNode root) {
if (root==null) {
return 0;
}
Queue<TreeNode> queue=new LinkedList<>();
int depth=0;
queue.offer(root);
while (queue.isEmpty()) {
int size=queue.size();
for (int i = 0; i < size; i++) {
TreeNode node=queue.poll();
if (node.left!=null) {
queue.offer(node.left);
}
if (node.right!=null) {
queue.offer(node.right);
}
}
depth++;
}
return depth;
}