文章目录
- 二叉树的层序遍历
- 226.翻转二叉树(层序遍历的衍生题)
- 101.对称二叉树
二叉树的层序遍历
文字讲解:二叉树的层序遍历
视频讲解:二叉树的层序遍历
状态:看了文字讲解后理解了,熟悉队列来遍历每层子节点的代码编写方式,理解广度优先遍历的思想; 代码的结构和迭代法遍历法的前序遍历非常相似;
思路:
1、层序遍历时,主要是掌握如何通过队列将每一层的节点加入到队列中,而层序遍历的整体思想和代码,跟前一天中的通过栈实现前序后序遍历的代码非常相似,只不过遍历借助数据结构不同;
代码:
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new LinkedList<>();if (root == null) return result;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {LinkedList<Integer> temp = new LinkedList<>();//每一层需要处理的节点数量,这一句非常重要;int len = queue.size();while (len > 0) {TreeNode poll = queue.poll();temp.add(poll.val);if (poll.left != null) {queue.offer(poll.left);}if (poll.right != null) {queue.offer(poll.right);}//poll完之后一定要--;len--;}result.add(temp);}return result;}
}
226.翻转二叉树(层序遍历的衍生题)
文字讲解:反转二叉树
视频讲解:代码随想录-反转二叉树
状态:这一题的解题思路主要是运用:层序遍历+左右节点翻转;
思路:
1、首先要明确,二叉树中的左右子树都调换位置就可以实现翻转二叉树了;
代码:
class Solution {public TreeNode invertTree(TreeNode root) {if (root == null) {return root;}//采用广度优先遍历ArrayDeque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);while (!queue.isEmpty()) {int len = queue.size();while (len>0) {TreeNode poll = queue.poll();swapNode(poll);if (poll.left != null) {queue.offer(poll.left);}if (poll.right != null) {queue.offer(poll.right);}len--;}}return root;}public void swapNode(TreeNode node) {TreeNode temp = node.left;node.left = node.right;node.right = temp;}
}
101.对称二叉树
文字讲解:对称二叉树
视频讲解:代码随想录-对称二叉树
状态:视频里讲的真好,推荐感兴趣看一下视频,可以帮助二叉树各遍历方式作用和理解递归的本质;
思路:
1、看视频讲解,看视频讲解,看视频讲解;此题可以帮助理解递归进行二叉树后序遍历的意义;
代码:
class Solution {public boolean isSymmetric(TreeNode root) {return isReverseTree(root.left, root.right);}//递归判断两个树是否可以相互翻转,即判断是否对称public boolean isReverseTree(TreeNode node1, TreeNode node2) {if (node1 == null && node2 != null) {return false;}if (node1 != null && node2 == null) {return false;}if (node1 == null && node2 == null) {return true;}if (node1 != null && node2 != null && node1.val != node2.val) {return false;}//判断两个子树的外侧是否相同boolean outFlag = isReverseTree(node1.left, node2.right);//判断两个子树的内侧是否相同boolean inFlag = isReverseTree(node1.right, node2.left);//两个子树的内外侧都相同,这两个子树可翻转即对称return outFlag && inFlag;}
}