提交 642e34db 编写于 作者: GreyZeng's avatar GreyZeng

update notes

上级 efe25c45
......@@ -7,165 +7,163 @@ import java.util.List;
import java.util.Map;
import java.util.Queue;
//树的按层遍历
//1. hash表+LinkedList
//2. 仅用LinkedList
//3. 自定义队列
// 笔记:https://www.cnblogs.com/greyzeng/p/16356829.html
// 树的按层遍历
// 1. hash表+LinkedList
// 2. 仅用LinkedList
// 3. 自定义队列
// https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
public class LeetCode_0102_BinaryTreeLevelOrderTraversal {
// 哈希表结合Java自带的LinkedList
public static List<List<Integer>> levelOrder3(TreeNode head) {
if (head == null) {
return new ArrayList<>();
}
List<List<Integer>> ans = new ArrayList<>();
// 记录某个节点在第几层
Map<TreeNode, Integer> map = new HashMap<>();
Queue<TreeNode> queue = new LinkedList<>();
// 当前是第几层
int curLevel = 0;
TreeNode cur = head;
queue.offer(cur);
map.put(cur, curLevel);
List<Integer> levelRecords = new ArrayList<>();
while (!queue.isEmpty()) {
TreeNode c = queue.poll();
int level = map.get(c);
if (c.left != null) {
queue.offer(c.left);
map.put(c.left, level + 1);
}
if (c.right != null) {
queue.offer(c.right);
map.put(c.right, level + 1);
}
if (curLevel == level) {
levelRecords.add(c.val);
} else {
ans.add(levelRecords);
levelRecords = new ArrayList<>();
levelRecords.add(c.val);
curLevel = level;
}
}
// 记得要存最后一层的数据
// 哈希表结合Java自带的LinkedList
public static List<List<Integer>> levelOrder3(TreeNode head) {
if (head == null) {
return new ArrayList<>();
}
List<List<Integer>> ans = new ArrayList<>();
// 记录某个节点在第几层
Map<TreeNode, Integer> map = new HashMap<>();
Queue<TreeNode> queue = new LinkedList<>();
// 当前是第几层
int curLevel = 0;
TreeNode cur = head;
queue.offer(cur);
map.put(cur, curLevel);
List<Integer> levelRecords = new ArrayList<>();
while (!queue.isEmpty()) {
TreeNode c = queue.poll();
int level = map.get(c);
if (c.left != null) {
queue.offer(c.left);
map.put(c.left, level + 1);
}
if (c.right != null) {
queue.offer(c.right);
map.put(c.right, level + 1);
}
if (curLevel == level) {
levelRecords.add(c.val);
} else {
ans.add(levelRecords);
return ans;
levelRecords = new ArrayList<>();
levelRecords.add(c.val);
curLevel = level;
}
}
// 用LinkedList
public static List<List<Integer>> levelOrder2(TreeNode head) {
if (head == null) {
return new ArrayList<>();
}
List<List<Integer>> ans = new ArrayList<>();
List<Integer> levelRecords = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
TreeNode curEnd = head;
TreeNode nextEnd = null;
queue.offer(curEnd);
while (!queue.isEmpty()) {
TreeNode c = queue.poll();
levelRecords.add(c.val);
if (c.left != null) {
queue.offer(c.left);
nextEnd = c.left;
}
if (c.right != null) {
queue.offer(c.right);
nextEnd = c.right;
}
if (c == curEnd) {
// 来到新的一层了
curEnd = nextEnd;
ans.add(levelRecords);
levelRecords = new ArrayList<>();
}
}
return ans;
// 记得要存最后一层的数据
ans.add(levelRecords);
return ans;
}
// 用LinkedList
public static List<List<Integer>> levelOrder2(TreeNode root) {
if (null == root) {
return new ArrayList<>();
}
public static class MyNode {
public TreeNode data;
public MyNode next;
public MyNode(TreeNode node) {
data = node;
}
List<List<Integer>> result = new ArrayList<>();
List<Integer> levelRecords = new ArrayList<>();
TreeNode curEnd = root;
TreeNode nextEnd = null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode poll = queue.poll();
levelRecords.add(poll.val);
if (null != poll.left) {
queue.offer(poll.left);
nextEnd = poll.left;
}
if (null != poll.right) {
queue.offer(poll.right);
nextEnd = poll.right;
}
if (poll == curEnd) {
curEnd = nextEnd;
result.add(levelRecords);
levelRecords = new ArrayList<>();
}
}
return result;
}
public static class MyQueue {
public MyNode front;
public MyNode end;
public int size;
public static class MyNode {
public TreeNode data;
public MyNode next;
public MyQueue() {
front = null;
end = null;
}
public MyNode(TreeNode node) {
data = node;
}
}
public void offer(MyNode c) {
size++;
if (front == null) {
front = c;
} else {
end.next = c;
}
end = c;
}
public static class MyQueue {
public MyNode front;
public MyNode end;
public int size;
public boolean isEmpty() {
return size == 0;
}
public MyQueue() {
front = null;
end = null;
}
public MyNode poll() {
size--;
MyNode ans = front;
front = front.next;
ans.next = null;
return ans;
}
public void offer(MyNode c) {
size++;
if (front == null) {
front = c;
} else {
end.next = c;
}
end = c;
}
public boolean isEmpty() {
return size == 0;
}
// 用自定义Queue
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
MyNode head = new MyNode(root);
MyQueue queue = new MyQueue();
queue.offer(head);
MyNode curEnd = head;
MyNode nextEnd = null;
List<Integer> item = new ArrayList<>();
MyNode t;
while (!queue.isEmpty()) {
MyNode c = queue.poll();
if (c.data.left != null) {
t = new MyNode(c.data.left);
queue.offer(t);
nextEnd = t;
}
if (c.data.right != null) {
t = new MyNode(c.data.right);
queue.offer(t);
nextEnd = t;
}
item.add(c.data.val);
if (curEnd.data == c.data) {
ans.add(item);
item = new ArrayList<>();
curEnd = nextEnd;
}
}
return ans;
public MyNode poll() {
size--;
MyNode ans = front;
front = front.next;
ans.next = null;
return ans;
}
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
// 用自定义Queue
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
MyNode head = new MyNode(root);
MyQueue queue = new MyQueue();
queue.offer(head);
MyNode curEnd = head;
MyNode nextEnd = null;
List<Integer> item = new ArrayList<>();
MyNode t;
while (!queue.isEmpty()) {
MyNode c = queue.poll();
if (c.data.left != null) {
t = new MyNode(c.data.left);
queue.offer(t);
nextEnd = t;
}
if (c.data.right != null) {
t = new MyNode(c.data.right);
queue.offer(t);
nextEnd = t;
}
item.add(c.data.val);
if (curEnd.data == c.data) {
ans.add(item);
item = new ArrayList<>();
curEnd = nextEnd;
}
}
return ans;
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
}
}
//Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
// Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from
// left to right, level by level from leaf to root).
//
//For example:
//Given binary tree [3,9,20,null,null,15,7],
// For example:
// Given binary tree [3,9,20,null,null,15,7],
// 3
// / \
// 9 20
// / \
// 15 7
//return its bottom-up level order traversal as:
//[
// return its bottom-up level order traversal as:
// [
// [15,7],
// [9,20],
// [3]
//]
// ]
package leetcode.medium;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Queue;
// 笔记:https://www.cnblogs.com/greyzeng/p/16356829.html
// 按层遍历进阶
public class LeetCode_0107_BinaryTreeLevelOrderTraversalII {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
Deque<List<Integer>> stack = new ArrayDeque<>();
if (root == null) {
return ans;
}
TreeNode cur = root;
TreeNode curEnd = cur;
TreeNode nextEnd = null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(cur);
List<Integer> item = new ArrayList<>();
while (!queue.isEmpty() ) {
cur = queue.poll();
if (cur.left != null) {
queue.offer(cur.left);
nextEnd = cur.left;
}
if (cur.right != null) {
queue.offer(cur.right);
nextEnd = cur.right;
}
item.add(cur.val);
if (cur == curEnd) {
stack.push(item);
item = new ArrayList<>();
curEnd = nextEnd;
}
}
while (!stack.isEmpty() ) {
ans.add(stack.pop());
}
return ans;
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (null == root) {
return new ArrayList<>();
}
Deque<List<Integer>> stack = new ArrayDeque<>();
List<List<Integer>> result = new ArrayList<>();
List<Integer> levelRecords = new ArrayList<>();
TreeNode curEnd = root;
TreeNode nextEnd = null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode poll = queue.poll();
levelRecords.add(poll.val);
if (null != poll.left) {
queue.offer(poll.left);
nextEnd = poll.left;
}
if (null != poll.right) {
queue.offer(poll.right);
nextEnd = poll.right;
}
if (poll == curEnd) {
curEnd = nextEnd;
stack.push(levelRecords);
levelRecords = new ArrayList<>();
}
}
while (!stack.isEmpty()) {
result.add(stack.poll());
}
return result;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册