题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
时间限制:1秒 空间限制:32768K
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
解题思路
1、深度遍历:使用队列遍历,同时计数
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null) return 0;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
int count=0;
while(!queue.isEmpty()){
for(int i=0;i<queue.size();i++){
TreeNode node=queue.poll();
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
count++;
}
return count;
}
}
类似题目:给定二叉树,求二叉树每层的平均数
public class Solution{
public ArrayList<Double> TreeDepth(TreeNode root) {
LinkedList<TreeNode> queue=new LinkedList<>();
ArrayList<Double> result=new ArrayList<>();
queue.offer(p);
while(!queue.isEmpty()) {
double sum=0;
int count=queue.size();
for(int i=0;i<count;i++) {
TreeNode node=queue.poll();
sum+=node.value;
if(node.right!=null) queue.offer(node.right);
if(node.left!=null) queue.offer(node.left);
}
result.add(sum/count);//将每层的平均值加入result中
}
return result;
}
}
2、使用递归:直接返回左右子树种最大深度值+1,依次递归
分析:
- 递归条件:当前结点的深度=左右子树结点的最大深度+1
- 递归出口:当前结点为空时,返回0;
public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null) return 0;
int left=TreeDepth(root.left);
int right=TreeDepth(root.right);
return left>right?left+1:right+1;
}
}
类似题目:给定二叉树,判断是否是二叉平衡树。参考leetcode的110题
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
if(treedepth(root)==-1) return false;
return true;
}
public int treedepth(TreeNode root){
if(root==null) return 0;//结点为null直接返回0
int left=treedepth(root.left);//左子树的深度
int right=treedepth(root.right);//右子树的深度
int dif=left-right;//计算平衡因子
if(dif>1||dif<-1||left==-1||right==-1) return -1;
return left>right?left+1:right+1;
}
}