HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树
HOT100–Day13–104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树
每日刷题系列。今天的题目是《力扣HOT100》题单。
题目类型:二叉树。
关键:要深刻理解《递归》
104. 二叉树的最大深度
方法:递归
思路:
自下而上地统计。(相当于后序遍历)
- 如果node是null,返回0
- 遍历node.left和node.right
- 取较大者,加一,返回给上一层。(为什么这里要“+1”,因为要告诉上一层“我这里有一层”,这个“一层”就是“+1”的效果。)
class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
}
方法:递归
思路:
自顶向下地统计。(相当于前序遍历)
class Solution {private int res;public int maxDepth(TreeNode root) {dfs(root, 0);return res;}private void dfs(TreeNode node, int depth) {if (node == null) {return;}depth++;res = Math.max(res, depth);dfs(node.left, depth);dfs(node.right, depth);}
}
方法:迭代
思路:
层序遍历。有多少层就有深。
- 利用queue来记录每层的节点。
- 遍历完一层之后,记录size。
- 下一层遍历queue中的size个节点。
class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}Deque<TreeNode> que = new ArrayDeque<>();int depth = 0;que.offer(root);while (!que.isEmpty()) {depth++;int size = que.size();while (size-->0) {TreeNode cur = que.poll();if (cur.left != null) {que.offer(cur.left);}if (cur.right != null) {que.offer(cur.right);}}}return depth;}
}
226. 翻转二叉树
思路:
自顶向下。
先交换左右子树,再进入下一层。递归解决。
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}// 先交换左右子树,再进入下一层TreeNode temp = root.left;root.left = root.right;root.right = temp;invertTree(root.left);invertTree(root.right);return root;}
}
思路:
自底向上。
先递归到最下层,交换左右节点。再返回给上层。
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}TreeNode left = invertTree(root.left);TreeNode right = invertTree(root.right);root.left = right;root.right = left;return root;}
}
101. 对称二叉树
思路:
先反转左子树,再和右子树比较是否相等。
class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}// 先反转左子树invertTree(root.left);// 再和右子树比较是否相等return isSameTree(root.left, root.right);}// 226. 翻转二叉树private TreeNode invertTree(TreeNode root) {if (root == null) {return null;}TreeNode left = invertTree(root.left);TreeNode right = invertTree(root.right);root.left = right;root.right = left;return root;}// 100. 相同的树private boolean isSameTree(TreeNode p, TreeNode q) {if (p == null || q == null) {return p == q;}return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}
}
思路:
直接改造isSameTree方法。
要判断三个条件:
1,该节点值是否相等。
2,left的左子树和right的右子树是否相等。
3,left的右子树和right的左子树是否相等,
class Solution {public boolean isSymmetric(TreeNode root) {return isSameTree(root.left, root.right);}// 在【100. 相同的树】的基础上稍加改动private boolean isSameTree(TreeNode p, TreeNode q) {if (p == null || q == null) {return p == q;}return p.val == q.val && isSameTree(p.left, q.right) && isSameTree(p.right, q.left);}
}