刷题神器
往期回顾
>【二叉树】|代码随想录算法训练营第11天|二叉树递归遍历、二叉树迭代遍历、二叉树层序遍历
题目
226.翻转二叉树
-
学后思路
翻转二叉树,就是逐级进行左右节点进行交换,可以用前序和后续遍历,不能使用中序遍历,中序遍历会导致已经交换的节点重新换回原来的位置
解法:
// 递归
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null)
return root;
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swap(TreeNode treeNode) {
TreeNode temp = treeNode.left;
treeNode.left = treeNode.right;
treeNode.right = temp;
}
}
//层序遍历
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null)
return root;
Stack<TreeNode> stack = new Stack();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
swap(node);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return root;
}
public void swap(TreeNode treeNode) {
TreeNode temp = treeNode.left;
treeNode.left = treeNode.right;
treeNode.right = temp;
}
}
- 题目总结
- 注意选择遍历的顺序,选择前序和后续较为方便,选择中序的话,需要遍历两次左子树
101. 对称二叉树
题目:题目链接
- 学后思路
对称二叉树,使用后序遍历进行处理,先处理左右子树,然后左右子树的结果决定父节点
解法一:
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
boolean result = compare(root.left, root.right);
return result;
}
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 out = compare(left.left, right.right);
boolean in = compare(left.right, right.left);
return out && in;
}
}
- 题目总结
- 注意判断条件,注意判断的顺序
104.二叉树的最大深度
- 学后思路
高度用后续,从下之上,深度用前序 从上至下
解法一:
class Solution {
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
int leftH = maxDepth(root.left);
int rightH = maxDepth(root.right);
return 1 + Math.max(leftH, rightH);
}
}
题目总结
- 后续遍历
111.二叉树的最小深度
- 学后思路
和最大深度思路类似,注意深度的意思是到叶子节点的最小距离
class Solution {
public int minDepth(TreeNode root) {
if (root == null)
return 0;
// 左
int minLeft = minDepth(root.left);
// 右
int minRight = minDepth(root.right);
// 中
if (root.left == null && root.right != null) {
return 1 + minRight;
} else if (root.left != null && root.right == null) {
return 1 + minLeft;
} else {
return 1 + Math.min(minLeft, minRight);
}
}
}
题目总结
- 使用后续遍历,注意中序遍历的时候要判断null的情况