二叉树的层序遍历
文字讲解:二叉树的层序遍历
视频讲解:二叉树的层序遍历
状态:看了文字讲解后理解了,熟悉队列来遍历每层子节点的代码编写方式,理解广度优先遍历的思想; 代码的结构和迭代法遍历法的前序遍历非常相似;
思路:
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;
}
}