104.二叉树的最大深度
完成
思路:
层序遍历时用队列做过。
也可以递归实现。
代码
class Solution {
public int getDepth(TreeNode node){
if(node==null) return 0;
return Math.max(getDepth(node.left), getDepth(node.right))+1;
}
public int maxDepth(TreeNode root) {
int depth =0;
if(root == null) return depth;
depth = getDepth(root);
return depth;
}
}
化简后可得
class Solution {
public int maxDepth(TreeNode root) {
if(root==null) return 0;
return Math.max(maxDepth(root.right), maxDepth(root.left))+1;
}
}
111.二叉树的最小深度
完成
思路:
层序遍历时用队列做过。
也可以递归实现。
代码
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
if(root.left == null && root.right != null) return 1+minDepth(root.right);
if(root.left != null && root.right == null) return 1+minDepth(root.left);
return 1+Math.min(minDepth(root.right),minDepth(root.left));
}
}
222.完全二叉树的节点个数
完成
代码
一般二叉树的递归解法
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
return countNodes(root.left)+countNodes(root.right)+1;
}
}
对于完全二叉树,如果它是一颗满二叉树,只要知道深度就可以计算出节点数量。而完全二叉树必定可以拆分为若干满二叉树。
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
// 判断是否为完全二叉树
int leftDepth = 0;
int rightDepth = 0;
TreeNode leftNode = root.left;
TreeNode rightNode = root.right;
while(leftNode!=null){
leftDepth++;
leftNode = leftNode.left;
}
while(rightNode!=null){
rightDepth++;
rightNode = rightNode.right;
}
// 如果是完全二叉树,就用公式计算
if(rightDepth==leftDepth) return (2<<rightDepth)-1;
// 不是完全二叉树,拆成左右子树再递归
return countNodes(root.left)+countNodes(root.right)+1;
}
}