层序遍历
参考文章:代码随想录
解题思路:
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。
需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
Deque<TreeNode> deque = new LinkedList<>();
if (root != null) deque.add(root);
while (!deque.isEmpty()) {
int size = deque.size();
List<Integer> list = new ArrayList<>();
while (size-- > 0) {
TreeNode node = deque.peek();
deque.poll();
list.add(node.val);
if (node.left != null) deque.add(node.left);
if (node.right != null) deque.add(node.right);
}
result.add(list);
}
return result;
}
226.翻转二叉树
参考文章:代码随想录
解题思路:
其实就是遍历二叉树,将节点的左右孩子进行呼唤即可,可以使用前序遍历或是后续遍历,注意中序遍历不可行,主要原因是当左孩子完成翻转后,到中结点会进行左右孩子的交换,然后再去完成此时右孩子的翻转时,其实本质上还是翻转的原来的左子树,因此达不到整体翻转的效果。
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
reverse(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void reverse(TreeNode root) {
TreeNode temp;
temp = root.left;
root.left = root.right;
root.right = temp;
}
101. 对称二叉树
参考文章: 代码随想录
参考视频:新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树_哔哩哔哩_bilibili
解题思路:
通过递归的方法去解决问题,遍历选择后序遍历,因为要得到左右孩子的比较结果,最终传到中间的结点,因此选择这种遍历方式,因为是对称二叉树,因此比较的俩结点在外侧是左孩子的左孩子对比右孩子的右孩子,内侧则是左孩子的右孩子对比右孩子的左孩子,当两个布尔值的与运算结果返回给父节点。
boolean result = true;
if (root != null) {
result = compare(root.left, root.right);
}
return result;
}
public boolean compare(TreeNode left, TreeNode right) {
if (left == null && right != null) {
return false;
} else if (left != null && right == null) {
return false;
} else if (left == null && right == null) {
return true;
} else if (left.val != right.val) {
return false;
} else {
boolean outside = compare(left.left, right.right);
boolean inside = compare(left.right, right.left);
return outside && inside;
}
}