LeetCode104.二叉树的最大深度
(1)递归
基本思路:如果能分别求得左右子树的深度,那么整个二叉树的最大深度就是两个子树中的较大值+1(根节点)。可以通过递归的方式得到左右两子树的深度。
Java代码如下:
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left, right) + 1;
}
(2)迭代
基本思路:使用一个队列,于基本递归换迭代方法类似,需要一个变量来控制每一层的结尾。可以使用添加之前的队列size来做。
Java代码如下:
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int ans = 0;
Queue<TreeNode> queue = new LinkedList<>();
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);
}
}
ans++;
}
return ans;
}
LeetCode111.二叉树的最小深度
(1)递归
基本思路:于104类似,只是判断条件改变了。
Java代码如下:
public int minDepth(TreeNode root) {
if(root == null) return 0;
if(root.left == null && root.right == null)
{
return 1;
}
int ans = Integer.MAX_VALUE;
if(root.left != null)
{
ans = Math.min(minDepth(root.left), ans);
}
if(root.right != null)
{
ans = Math.min(minDepth(root.right),ans);
}
return ans + 1;
}
(2)迭代
基本思路:于104思路基本相似,当遍历到当前的节点的左右孩子都为空的时候,就直接返回当前层数,因为队列中存放的是当前层所有的节点,当有一个节点的左右孩子为空了,说明当前层就是最小深度。
Java代码如下:
public int minDepth(TreeNode root) {
if(root == null) return 0;
int ans = 1;
Queue<TreeNode> queue = new LinkedList<>();
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 && node.right == null)
{
return ans;
}
if(node.left != null)
{
queue.offer(node.left);
}
if(node.right != null)
{
queue.offer(node.right);
}
}
ans++;
}
return 0;
}
LeetCode222.完全二叉树的节点个数
基本思路:本题可以使用上述两题的递归和迭代方法遍历每个节点并且计数。但是题目给定二叉树为完全二叉树,完全二叉树只有两种情况:
情况一:就是满二叉树,情况二:最后一层叶子节点没有满。对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
Java代码如下:
public int countNodes(TreeNode root) {
if(root == null)
{
return 0;
}
TreeNode left = root.left;
TreeNode right = root.right;
int leftDepth = 0;
int rightDepth = 0;
while(left != null)
{
left = left.left;
leftDepth++;
}
while(right != null)
{
right = right.right;
rightDepth++;
}
if(leftDepth == rightDepth)
{
return (2 << leftDepth) - 1;
}
return countNodes(root.left) + countNodes(root.right) + 1;
}