LeetCode 199.二叉树右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
层序遍历一个思路,只需要判断当前元素是否是最后一个元素,仅保存最后一个元素就可以了。
// 199.二叉树的右视图 public class N0199 { /** * 解法:队列,迭代。 * 每次返回每层的最后一个字段即可。 * * 小优化:每层右孩子先入队。代码略。 */ public List<Integer> rightSideView(TreeNode root) { List<Integer> list = new ArrayList<>(); Deque<TreeNode> que = new LinkedList<>(); if (root == null) { return list; } que.offerLast(root); while (!que.isEmpty()) { int levelSize = que.size(); for (int i = 0; i < levelSize; i++) { TreeNode poll = que.pollFirst(); if (poll.left != null) { que.addLast(poll.left); } if (poll.right != null) { que.addLast(poll.right); } if (i == levelSize - 1) { list.add(poll.val); } } } return list; } }
LeetCode 637.二叉树的层平均值
思路:层序遍历,每一层的总和取个平均值即可。
// 637. 二叉树的层平均值 public class N0637 { /** * 解法:队列,迭代。 * 每次返回每层的最后一个字段即可。 */ public List<Double> averageOfLevels(TreeNode root) { List<Double> list = new ArrayList<>(); Deque<TreeNode> que = new LinkedList<>(); if (root == null) { return list; } que.offerLast(root); while (!que.isEmpty()) { TreeNode peek = que.peekFirst(); int levelSize = que.size(); double levelSum = 0.0; for (int i = 0; i < levelSize; i++) { TreeNode poll = que.pollFirst(); levelSum += poll.val; if (poll.left != null) { que.addLast(poll.left); } if (poll.right != null) { que.addLast(poll.right); } } list.add(levelSum / levelSize); } return list; } }
LeetCode 429.N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 :
返回其层序遍历:
[ [1], [3,2,4], [5,6] ]
// 429. N 叉树的层序遍历 public class N0429 { /** * 解法1:队列,迭代。 */ public List<List<Integer>> levelOrder(Node root) { List<List<Integer>> list = new ArrayList<>(); Deque<Node> que = new LinkedList<>(); if (root == null) { return list; } que.offerLast(root); while (!que.isEmpty()) { int levelSize = que.size(); List<Integer> levelList = new ArrayList<>(); for (int i = 0; i < levelSize; i++) { Node poll = que.pollFirst(); levelList.add(poll.val); List<Node> children = poll.children; if (children == null || children.size() == 0) { continue; } for (Node child : children) { if (child != null) { que.offerLast(child); } } } list.add(levelList); } return list; } class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { val = _val; children = _children; } } }
LeetCode 515.在每个树行中找最大值
思路:
层序遍历,取每层的最大值。
class Solution { public List<Integer> largestValues(TreeNode root) { if(root == null){ return Collections.emptyList(); } List<Integer> result = new ArrayList(); Queue<TreeNode> queue = new LinkedList(); queue.offer(root); while(!queue.isEmpty()){ int max = Integer.MIN_VALUE; for(int i = queue.size(); i > 0; i--){ TreeNode node = queue.poll(); max = Math.max(max, node.val); if(node.left != null) queue.offer(node.left); if(node.right != null) queue.offer(node.right); } result.add(max); } return result; } }
LeetCode116.填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
思路:
本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了
class Solution { public Node connect(Node root) { Queue<Node> tmpQueue = new LinkedList<Node>(); if (root != null) tmpQueue.add(root); while (tmpQueue.size() != 0){ int size = tmpQueue.size(); Node cur = tmpQueue.poll(); if (cur.left != null) tmpQueue.add(cur.left); if (cur.right != null) tmpQueue.add(cur.right); for (int index = 1; index < size; index++){ Node next = tmpQueue.poll(); if (next.left != null) tmpQueue.add(next.left); if (next.right != null) tmpQueue.add(next.right); cur.next = next; cur = next; } } return root; } }
标签:Node,null,int,代码,随想录,Day17,que,poll,root
From: https://www.cnblogs.com/dwj-ngu/p/16860487.html