二叉树的最大深度、翻转二叉树、对称二叉树
二叉树的最大深度
力扣连接:104. 二叉树的最大深度(简单)
1.递归的方法
递归的图解步骤
暂无
递归代码
class Solution {
int max = 0;
public int maxDepth(TreeNode root) {
if(root==null) return 0;
max = Math.max(maxDepth(root.left),maxDepth(root.right))+1;
return max;
}
}
2.迭代的方法
使用队列的方法
迭代的图解步骤
代码
class Solution {
public int maxDepth(TreeNode root) {
int result = 0;
if(null==root) return result;
Queue<TreeNode> que = new LinkedList<>();
que.add(root);
while(!que.isEmpty()){
int size = que.size();
while(size>0){
TreeNode tmp = que.poll();
if(null!=tmp.left) que.add(tmp.left);
if(null!=tmp.right) que.add(tmp.right);
size--;
}
result++;
}
return result;
}
}
二叉树的最小深度
力扣连接:111. 二叉树的最小深度(简单)
1.递归的方法
递归的图解步骤
递归代码
class Solution {
/**
* 递归法,相比求MaxDepth要复杂点
* 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
*/
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = minDepth(root.left);
int rightDepth = minDepth(root.right);
if (root.left == null) {
return rightDepth + 1;
}
if (root.right == null) {
return leftDepth + 1;
}
// 左右结点都不为null
return Math.min(leftDepth, rightDepth) + 1;
}
}
2.迭代的方法
关键点:
- 由于是从上往下遍历,遇到第一个左右==null的叶子结点即最小值
代码
class Solution {
/**
* 迭代法,层序遍历
*/
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
int depth = 0;
while (!deque.isEmpty()) {
int size = deque.size();
depth++;
for (int i = 0; i < size; i++) {
TreeNode poll = deque.poll();
if (poll.left == null && poll.right == null) {
// 是叶子结点,直接返回depth,因为从上往下遍历,所以该值就是最小值
return depth;
}
if (poll.left != null) {
deque.offer(poll.left);
}
if (poll.right != null) {
deque.offer(poll.right);
}
}
}
return depth;
}
}
完全二叉树的节点个数
力扣连接:222.完全二叉树的节点个数(中等)
1.完全二叉树 特性的方法
图解步骤
判断其子树是不是满二叉树,不是就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。
代码
class Solution {
//第一步,确定递归函数的参数和返回值
public int countNodes(TreeNode root) {
//第二步,终止条件的写法
if(root==null) return 0;
TreeNode leftNode = root.left;
TreeNode rightNode = root.right;
int leftCount = 0,rightCount = 0;
while(leftNode!=null){
leftNode = leftNode.left;
leftCount++;
}
while(rightNode!=null){
rightNode = rightNode.right;
rightCount++;
}
if(leftCount==rightCount){
return (2<<leftCount)-1;
}
//第三步,单层递归的逻辑
int left = countNodes(root.left); //左
int right = countNodes(root.right);//右
int total = left + right + 1;//中
return total;
}
}