目录
DAY15
层序遍历
看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。
题目链接/文章讲解/视频讲解:代码随想录
102.二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
解题思路&代码
思路:
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现。
队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
class Solution {
//使用一个二维数组存储结果
public List <List<Integer>> resList = new ArrayList<List<Integer>> ();
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun02(root);
return resList;
}
public void checkFun02(TreeNode node) {
//判断二叉树是否为null
if(node == null) return;
//使用链表创建队伍,队伍就是一种链表
Queue<TreeNode> que = new LinkedList<>();
que.offer(node);
while( !que.isEmpty()) {
List<Integer> itemList = new ArrayList<Integer>();
//每一层遍历完后重新赋值size,从而有序遍历这一层
int len = que.size();
while (len > 0) {
TreeNode tempNode = que.poll();
//记录一层的数组
itemList.add(tempNode.val);
//将弹出tempNode的下一层节点引入
if(tempNode.left != null) que.offer(tempNode.left);
if(tempNode.right != null) que.offer(tempNode.right);
len--;
}
//每遍历完一层,把结果存入二维数组中
resList.add(itemList);
}
}
}
解题思路&代码
思路:画图是最好理解,理清思路的方式,明确自己用的是哪一种遍历方式
遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果
这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了
class Solution {
public TreeNode invertTree(TreeNode root) {
//终止条件就是节点没有left,right了,不然就一直左右互换
if( root == null) {
return null;
}
invertTree(root.left);
invertTree(root.right);
swapChildern(root);
//返回的root,是一个包含left,right的二叉树节点
return root;
}
//单独写了一个左右互换的函数
private void swapChildern(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
解题思路&代码
思路:如果要先判断子节点是否符合再判断根节点情况,一般都用后序遍历!!!
本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。
public boolean isSymmetric1(TreeNode root) {
return compare(root.left, root.right);
}
//创建了一个函数来比较左右节点的情况
private 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 compareOutside = compare(left.left, right.right);
// 比较内侧
boolean compareInside = compare(left.right, right.left);
return compareOutside && compareInside;
}