LeetCode:层序遍历 10
1.思路
结果导向:每一层一个数组,结果集为多层的结果,也就是数组为单位的结果集,故采用链表存储
2.代码实现
class Solution {
public List<List<Integer>> resList = new ArrayList<>(); // 存放结果数组的链表,作为结果集
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun(root); // 调用函数checFun()
return resList;
}
public void checkFun(TreeNode node) {
if (node == null) return;
Queue<TreeNode> que = new LinkedList<>(); // 队列存放节点,打辅助
que.offer(node);
while (!que.isEmpty()) { // 只要队列不为null,循环遍历,当为null时,二叉树也遍历完了
List<Integer> list = new ArrayList<>(); // 每层循环创建一个链表list,装入本层结果
int len = que.size(); // 获取本层加入节点数
// 对本层进行循环遍历
while (len > 0) {
TreeNode tmp = que.poll(); // 临时节点存储队列门口的节点
list.add(tmp.val); // 加入结果集中
if (tmp.left != null) que.offer(tmp.left); // 下一层:左节点不为null时加入队列
if (tmp.right != null) que.offer(tmp.right); // 下一层:右节点不为null时加入队列
len--; // 当前层在队列中数值减1
}
resList.add(list); //一层循环结束表明一层结束,将该层结果加入结果集中
}
}
}
// 递归 不太好理解
class Solution {
public List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun(root, 0);
return resList;
}
public void checkFun(TreeNode node, Integer deep) {
if (node == null) return;
deep++;
if (resList.size() < deep) {
List<Integer> list = new ArrayList<>();
resList.add(list);
}
resList.get(deep - 1).add(node.val);
checkFun(node.left, deep);
checkFun(node.right,deep);
}
}
LeetCode:226.翻转二叉树
1.思路
从叶子节点开始反转,后序遍历(左右中)即可,
2.代码实现
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
invertTree(root.left);
invertTree(root.right);
swapChildren(root);
return root;
}
private void swapChildren(TreeNode root) {
TreeNode tmpNode = root.left;
root.left = root.right;
root.right = tmpNode;
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).
LeetCode:101.对称二叉树
1.思路
后序遍历,保证左右节点均遍历过,保存了根节点左右子树是否对称的信息,才能对树的对称性进行判断。 另外一种思路,中序遍历输出结果到数组,对数组进行双指针遍历判断即可。
2.代码实现
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 compareOutside = compare(left.left, right.right);
boolean compareInside = compare(left.right, right.left);
return compareInside && compareOutside;
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(1).