二叉树的层序遍历:https://leetcode.cn/problems/binary-tree-level-order-traversal/
层序遍历使用队列实现:用size记录当前层的个数,size--控制弹出元素的个数,保证当前层的元素都弹出后,再去遍历弹出下一层的元素。
public List<List<Integer>> levelOrder(TreeNode root) { ArrayList<List<Integer>> res = new ArrayList<>(); if (root == null){ return res; } //借助队列 LinkedList<TreeNode> treeNodes = new LinkedList<>(); treeNodes.offer(root); while (!treeNodes.isEmpty()){ ArrayList<Integer> list = new ArrayList<>(); int size = treeNodes.size(); while (size-- > 0){//不能使用treeNodes.size()--,因为treeNodes.size()是不断变化的 TreeNode pop = treeNodes.pop(); list.add(pop.val); if (pop.left != null){ treeNodes.offer(pop.left); } if (pop.right != null) { treeNodes.offer(pop.right); } } res.add(list); } return res; }
226.反转二叉树:https://leetcode.cn/problems/invert-binary-tree/
广度优先搜索BFS:遍历每一层的时候翻转二叉树
深度优先搜索DFS:
指针交换、而不是只是交换值。前序和后序最直接,中序遍历会将没棵子树的根节点遍历两遍。
递归遍历需要再理解理解。
class Solution{ //DFS、递归 public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } //后序遍历 invertTree(root.left); invertTree(root.right); reverseNode(root); return root; } private void reverseNode(TreeNode root) { TreeNode temp = root.left; root.left = root.right; root.right = temp; } }
101.对称二叉树:https://leetcode.cn/problems/symmetric-tree/
需要注意的点:
- 外侧结点相比较,内侧结点相比较;
- 判断根节点的左子树是否能翻转成右子树;
- 只能使用后序遍历,后序遍历才可以将一个子树的左右孩子的信息返回给根节点。
什么类型的题使用后序遍历?需要处理孩子的信息,向上一层返回
public boolean isSymmetric(TreeNode root) { return compare(root.left, root.right); } private boolean compare(TreeNode left, TreeNode right) { //终止条件 if (left == null && right == null) { return true; } else if (left == null && right != null) { return false; } else if (left != null && right == null) { return false; } else if (left.val != right.val) { return false; } //可以继续执行的逻辑 boolean compareOutside = compare(left.left, right.right); //外侧:左孩子的左孩子和右孩子的右孩子比较 boolean compareInside = compare(left.right, right.left); //内侧:左孩子的右孩子和右孩子的左孩子比较 return compareOutside && compareInside; }