精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服
《经典图论算法》专栏:50多种经典图论算法全部掌握
奇怪的字节hr,都给人家发邮件通知面试了,结果把人家给删了(这是拉黑还是删除?),网友评论:很多字节的hr都是实习的,实习生离职了当然要删了。如果真是这样,那也太不正规了,直接搞个企业微信,离职之后微信账号继续让其他人来维护就行了。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第102题:二叉树的层序遍历。
问题描述
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
输入:root = [1]
输出:[[1]]
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000
问题分析
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new LinkedList<>();
if (root == null)
return ans;
Queue<TreeNode> queue = new LinkedList<>();// 创建队列
queue.offer(root);// 把根节点添加到队列中
while (!queue.isEmpty()) {
int levelCount = queue.size();// 每层的节点个数
// 每层的集合。
List<Integer> subList = new ArrayList<>();
// 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
for (int i = 0; i < levelCount; i++) {
TreeNode cur = queue.poll();// 节点出队
subList.add(cur.val);
// 左右子节点如果不为空就添加到队列中。
if (cur.left != null)
queue.offer(cur.left);
if (cur.right != null)
queue.offer(cur.right);
}
ans.add(subList);// 当前层的集合添加到队列中。
}
return ans;
}
public:
vector<vector<int>> levelOrder(TreeNode *root) {
vector<vector<int>> ans;
if (root == nullptr)
return ans;
queue<TreeNode *> q;// 创建队列
q.push(root);// 把根节点添加到队列中
while (!q.empty()) {
int levelCount = q.size();// 每层的节点个数
// 每层的集合。
vector<int> subList;
// 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
for (int i = 0; i < levelCount; i++) {
TreeNode *cur = q.front();
q.pop();// 节点出队
subList.push_back(cur->val);
// 左右子节点如果不为空就添加到队列中。
if (cur->left)
q.push(cur->left);
if (cur->right)
q.push(cur->right);
}
ans.push_back(subList);// 当前层的集合添加到队列中。
}
return ans;
}
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
ans = []
if root is None:
return ans
q = deque([root]) # 创建队列
while q:
levelCount = len(q) # 每层的节点个数
# 每层的集合。
subList = []
# 遍历当前层的所有节点,顺便把下一层的所有节点添加到队列中。
for _ in range(0, levelCount):
cur = q.popleft() # 节点出队
subList.append(cur.val)
# 左右子节点如果不为空就添加到队列中。
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
ans.append(subList) # 当前层的集合添加到队列中。
return ans
数组,稀疏表(Sparse Table),单向链表,双向链表,块状链表,跳表,队列和循环队列,双端队列,单调队列,栈,单调栈,双端栈,散列表,堆,字典树(Trie树),ArrayMap,SparseArray,二叉树,二叉搜索树(BST),笛卡尔树,AVL树,树堆(Treap),FHQ-Treap,哈夫曼树,滚动数组,差分数组,LRU缓存,LFU缓存
……
图的介绍,图的表示方式,邻接矩阵转换,广度优先搜索(BFS),深度优先搜索(DFS),A*搜索算法,迭代深化深度优先搜索(IDDFS),IDA*算法,双向广度优先搜索,迪杰斯特拉算法(Dijkstra),贝尔曼-福特算法(Bellman-Ford),SPFA算法,弗洛伊德算法(Floyd),卡恩(Kahn)算法,基于DFS的拓扑排序,约翰逊算法(Johnson)
……