赞
踩
day15主要内容
- 二叉树的层序遍历
- 翻转二叉树
- 对称二叉树,其实就是判断2个树能不能翻转。
声明
本文思路和文字,引用自《代码随想录》
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<List<Integer>>(); ArrayDeque<TreeNode> deque = new ArrayDeque<>(); if (root == null) { return result; } deque.offer(root); while (root!=null) { List<Integer> itemList = new ArrayList<>(); int size = deque.size(); while (size > 0) { TreeNode tmpNode = deque.poll(); itemList.add(tmpNode.val); if (tmpNode.left != null) { deque.offer(tmpNode.left); } if (tmpNode.right != null) { deque.offer(tmpNode.right); } size--; } result.add(itemList); } return result; } }
为什么这么写是错的。
很明显,能写出这种代码说明没有理解思路。没有理解怎么保存当前层的节点个数。
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<List<Integer>>(); ArrayDeque<TreeNode> deque = new ArrayDeque<>(); if (root == null) { return result; } deque.offer(root); while (!deque.isEmpty()) { List<Integer> itemList = new ArrayList<>(); int size = deque.size(); while (size > 0) { TreeNode tmpNode = deque.poll(); itemList.add(tmpNode.val); if (tmpNode.left != null) { deque.offer(tmpNode.left); } if (tmpNode.right != null) { deque.offer(tmpNode.right); } size--; } result.add(itemList); } return result; } }
class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return root; } swapChirdren(root); invertTree(root.left); invertTree(root.right); return root; } private TreeNode swapChirdren(TreeNode root) { TreeNode temp = root.left; root.left = root.right; root.right = temp; return root; } }
核心思路:比较根节点的两个子树是否是相互翻转的
所谓是否可以翻转,就是判断左子树的左侧节点和右子树的右节点是否值相等,如果存在且值相等,就认为是可以翻转的。
也就是外侧和外侧相比,内侧和内侧相比。
本题采用递归实现,所以想一下递归三部曲的思路,
class Solution { public boolean isSymmetric(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 b1 = compare(left.left, right.right); boolean b2 = compare(left.right, right.left); //内侧和外侧的结果需要告诉上一层的父节点, return b1 && b2; } }
本文思路引用自代码随想录,感谢代码随想录作者。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。