题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,
最长路径的长度为树的深度。
本人递归没有做出来,理解也花了挺多时间。层次遍历好理解但也没做出来,惭愧。
思路:
1)递归。必须掌握递归求树深度的方法。简介,但不太好理解。0开始从下至上的增长
2)层次遍历。也必须掌握。可同时实现层次遍历(即从上到下,从左到右遍历结点)和计算每层的结点数
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node4.left = node6;
Solution s = new Solution();
}
//递归方式:总深度=左右子树中较大的深度+1
public int TreeDepth(TreeNode root) {
if (root == null) {
return 0;//叶子结点的下一层为null,null层计为0深度
}
int leftDepth = TreeDepth(root.left);
int rightDepth = TreeDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;//+1表示加上当前层的一层深度
}
//非递归方式,使用队列层次遍历树,计算每一层的结点数,每层计算完深度+1,
//其实就是从上到下从左到右遍历二叉树的改进
public int TreeDepth2(TreeNode root) {
if (root == null)
return 0;
ArrayList<TreeNode> queue = new ArrayList<>();
//将根节点入栈
queue.add(root);
int curCount = 1;//当前层的结点数,初始为第一层,只有根节点,所以是1
int count = 0;//记录遍历到当前层的第几个结点
int depth = 0;//记录深度
while (!queue.isEmpty()) {
//取出当前队列的第一个结点top
TreeNode top = queue.remove(0);
count++;
if (top.left != null) {
queue.add(top.left);
}
if (top.right != null) {
queue.add(top.right);
}
//若没有达到curCount就不断从队列头取出,直到当前层结点遍历完
if (count == curCount) {//当前层结点遍历完
depth++;//深度+1,即将进入下层
curCount = queue.size();//计算下一层要遍历的结点数,即目前队列内的结点数
count = 0;//重置下一轮的计数器
}
}
return depth;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}