递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中
101. 对称二叉树
题目链接:. - 力扣(LeetCode)
思路:对称二叉树是关于中线轴对称,左子树的左孩子和右子树的右孩子相等
可以用递归法:
public boolean compare(TreeNode left, TreeNode right) {
if(left == null && right != null) return false;
if(left != null && right == null) return false;
if(left == null && right == null) return true;
if(left.val != right.val) return false;
boolean inside = compare(left.right,right.left);
boolean outside = compare(left.left,right.right);
return inside && outside;
}
终止条件是左右结点同时为空(true)或者有一个为空(false),或者值不等(false)
单层递归逻辑是: 内侧相等,外侧相等;要让对应的孩子都能比较一下
转化为迭代法:
while(!queue.isEmpty()) {
TreeNode leftNode = queue.poll();
TreeNode rightNode = queue.poll();
if(leftNode == null && rightNode == null) continue;
if(leftNode == null || rightNode == null || (leftNode.val != rightNode.val)) return false;
queue.offer(leftNode.left);
queue.offer(rightNode.right);
queue.offer(leftNode.right);
queue.offer(rightNode.left);
}
处理出队的前两个,让前两个是要比较的那两个
226. 翻转二叉树
题目链接:. - 力扣(LeetCode)
思路:把二叉树所有的子树都翻转,可以用递归的方法,也可以用迭代法
递归法:确定参数返回值;终止条件;单层递归逻辑;
TreeNode temp;
temp = node.left;
node.left = node.right;
node.right = temp;
reverse(node.left);
reverse(node.right);
104.二叉树最大深度
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:代码随想录算法公开课 | 最强算法公开课 | 代码随想录
思路:高度是当前结点到叶子结点的最大海拔;深度是根节点到最远叶子结点的海拔
可以用递归和层序遍历
//递归
public void getDepth(TreeNode node, int depth) {
result = result > depth ? result : depth; //最大深度
if(node.left == null && node.right == null)return;
if(node.left != null) getDepth(node.left,depth+1);
if(node.right != null) getDepth(node.right,depth+1);
return;
}
n叉树同理;
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中
层序遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()) {
int size = queue.size();
result++;
for(int i=0;i<size;i++) {
TreeNode temp = queue.poll();
if(temp.left != null)queue.offer(temp.left);
if(temp.right != null)queue.offer(temp.right);
}
}
111.二叉树最小深度
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:代码随想录算法公开课 | 最强算法公开课 | 代码随想录
思路:也可以用递归和层序遍历
层序遍历
while(!queue.isEmpty()){
size = queue.size();
deep++;
while(size>0){
TreeNode node = queue.poll();
if(node.left!=null)queue.offer(node.left);
if(node.right!=null)queue.offer(node.right);
if((node.left==null)&&(node.right==null)){
return deep;
}
size--;
}
}
递归时有一个坑,如果左子树为空,右子树不为空,最小深度就是1+右子树深度
int leftDepth = getDepth(node->left); // 左
int rightDepth = getDepth(node->right); // 右
// 中
// 当一个左子树为空,右不为空,这时并不是最低点
if (node->left == NULL && node->right != NULL) {
return 1 + rightDepth;
}
// 当一个右子树为空,左不为空,这时并不是最低点
if (node->left != NULL && node->right == NULL) {
return 1 + leftDepth;
}
int result = 1 + min(leftDepth, rightDepth);
return result;