mirror of
https://github.com/krahets/hello-algo.git
synced 2025-01-24 06:50:26 +08:00
Merge branch 'develop'
This commit is contained in:
commit
113450dc93
@ -14,8 +14,9 @@ struct Vertex {
|
|||||||
|
|
||||||
/* 基于邻接表实现的无向图类 */
|
/* 基于邻接表实现的无向图类 */
|
||||||
class GraphAdjList {
|
class GraphAdjList {
|
||||||
// 请注意,vertices 和 adjList 中存储的都是 Vertex 对象
|
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率
|
||||||
unordered_map<Vertex*, unordered_set<Vertex*>> adjList; // 邻接表(使用哈希表实现)
|
// 请注意,adjList 中的元素是 Vertex 对象
|
||||||
|
unordered_map<Vertex*, unordered_set<Vertex*>> adjList;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* 构造方法 */
|
/* 构造方法 */
|
||||||
@ -52,7 +53,7 @@ public:
|
|||||||
/* 添加顶点 */
|
/* 添加顶点 */
|
||||||
void addVertex(Vertex* vet) {
|
void addVertex(Vertex* vet) {
|
||||||
if (adjList.count(vet)) return;
|
if (adjList.count(vet)) return;
|
||||||
// 在邻接表中添加一个新链表(即 HashSet)
|
// 在邻接表中添加一个新链表
|
||||||
adjList[vet] = unordered_set<Vertex*>();
|
adjList[vet] = unordered_set<Vertex*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,9 +61,9 @@ public:
|
|||||||
void removeVertex(Vertex* vet) {
|
void removeVertex(Vertex* vet) {
|
||||||
if (!adjList.count(vet))
|
if (!adjList.count(vet))
|
||||||
throw invalid_argument("不存在顶点");
|
throw invalid_argument("不存在顶点");
|
||||||
// 在邻接表中删除顶点 vet 对应的链表(即 HashSet)
|
// 在邻接表中删除顶点 vet 对应的链表
|
||||||
adjList.erase(vet);
|
adjList.erase(vet);
|
||||||
// 遍历其它顶点的链表(即 HashSet),删除所有包含 vet 的边
|
// 遍历其它顶点的链表,删除所有包含 vet 的边
|
||||||
for (auto& [key, set_] : adjList) {
|
for (auto& [key, set_] : adjList) {
|
||||||
set_.erase(vet);
|
set_.erase(vet);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "../include/include.hpp"
|
#include "../include/include.hpp"
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
vector<int> hierOrder(TreeNode* root) {
|
vector<int> levelOrder(TreeNode* root) {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
queue<TreeNode*> queue;
|
queue<TreeNode*> queue;
|
||||||
queue.push(root);
|
queue.push(root);
|
||||||
@ -35,7 +35,7 @@ int main() {
|
|||||||
PrintUtil::printTree(root);
|
PrintUtil::printTree(root);
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
vector<int> vec = hierOrder(root);
|
vector<int> vec = levelOrder(root);
|
||||||
cout << endl << "层序遍历的结点打印序列 = ";
|
cout << endl << "层序遍历的结点打印序列 = ";
|
||||||
PrintUtil::printVector(vec);
|
PrintUtil::printVector(vec);
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ public class binary_tree_bfs
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
public List<int> hierOrder(TreeNode root)
|
public List<int> levelOrder(TreeNode root)
|
||||||
{
|
{
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
Queue<TreeNode> queue = new();
|
Queue<TreeNode> queue = new();
|
||||||
@ -41,7 +41,7 @@ public class binary_tree_bfs
|
|||||||
Console.WriteLine("\n初始化二叉树\n");
|
Console.WriteLine("\n初始化二叉树\n");
|
||||||
PrintUtil.PrintTree(root);
|
PrintUtil.PrintTree(root);
|
||||||
|
|
||||||
List<int> list = hierOrder(root);
|
List<int> list = levelOrder(root);
|
||||||
Console.WriteLine("\n层序遍历的结点打印序列 = " + string.Join(",", list.ToArray()));
|
Console.WriteLine("\n层序遍历的结点打印序列 = " + string.Join(",", list.ToArray()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@ func newVertex(val int) vertex {
|
|||||||
|
|
||||||
/* 基于邻接表实现的无向图类 */
|
/* 基于邻接表实现的无向图类 */
|
||||||
type graphAdjList struct {
|
type graphAdjList struct {
|
||||||
// 请注意,vertices 和 adjList 中存储的都是 Vertex 对象
|
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率
|
||||||
// 邻接表(使用哈希表实现), 使用哈希表模拟集合
|
// 请注意,adjList 中的元素是 Vertex 对象
|
||||||
adjList map[vertex]map[vertex]struct{}
|
adjList map[vertex]map[vertex]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ func (g *graphAdjList) addVertex(vet vertex) {
|
|||||||
if ok {
|
if ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 在邻接表中添加一个新链表(即 set)
|
// 在邻接表中添加一个新链表
|
||||||
g.adjList[vet] = make(map[vertex]struct{})
|
g.adjList[vet] = make(map[vertex]struct{})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ func (g *graphAdjList) removeVertex(vet vertex) {
|
|||||||
}
|
}
|
||||||
// 在邻接表中删除顶点 vet 对应的链表
|
// 在邻接表中删除顶点 vet 对应的链表
|
||||||
delete(g.adjList, vet)
|
delete(g.adjList, vet)
|
||||||
// 遍历其它顶点的链表(即 Set),删除所有包含 vet 的边
|
// 遍历其它顶点的链表,删除所有包含 vet 的边
|
||||||
for _, set := range g.adjList {
|
for _, set := range g.adjList {
|
||||||
// 操作
|
// 操作
|
||||||
delete(set, vet)
|
delete(set, vet)
|
||||||
|
@ -11,7 +11,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
func hierOrder(root *TreeNode) []int {
|
func levelOrder(root *TreeNode) []int {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
queue := list.New()
|
queue := list.New()
|
||||||
queue.PushBack(root)
|
queue.PushBack(root)
|
||||||
|
@ -11,7 +11,7 @@ import (
|
|||||||
. "github.com/krahets/hello-algo/pkg"
|
. "github.com/krahets/hello-algo/pkg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHierOrder(t *testing.T) {
|
func TestLevelOrder(t *testing.T) {
|
||||||
/* 初始化二叉树 */
|
/* 初始化二叉树 */
|
||||||
// 这里借助了一个从数组直接生成二叉树的函数
|
// 这里借助了一个从数组直接生成二叉树的函数
|
||||||
root := ArrToTree([]any{1, 2, 3, 4, 5, 6, 7})
|
root := ArrToTree([]any{1, 2, 3, 4, 5, 6, 7})
|
||||||
@ -19,6 +19,6 @@ func TestHierOrder(t *testing.T) {
|
|||||||
PrintTree(root)
|
PrintTree(root)
|
||||||
|
|
||||||
// 层序遍历
|
// 层序遍历
|
||||||
nums := hierOrder(root)
|
nums := levelOrder(root)
|
||||||
fmt.Println("\n层序遍历的结点打印序列 =", nums)
|
fmt.Println("\n层序遍历的结点打印序列 =", nums)
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import java.util.*;
|
|||||||
|
|
||||||
public class binary_tree_bfs {
|
public class binary_tree_bfs {
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
static List<Integer> hierOrder(TreeNode root) {
|
static List<Integer> levelOrder(TreeNode root) {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};
|
Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};
|
||||||
// 初始化一个列表,用于保存遍历序列
|
// 初始化一个列表,用于保存遍历序列
|
||||||
@ -35,7 +35,7 @@ public class binary_tree_bfs {
|
|||||||
PrintUtil.printTree(root);
|
PrintUtil.printTree(root);
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
List<Integer> list = hierOrder(root);
|
List<Integer> list = levelOrder(root);
|
||||||
System.out.println("\n层序遍历的结点打印序列 = " + list);
|
System.out.println("\n层序遍历的结点打印序列 = " + list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,10 @@ class Vertex {
|
|||||||
|
|
||||||
/* 基于邻接表实现的无向图类 */
|
/* 基于邻接表实现的无向图类 */
|
||||||
class GraphAdjList {
|
class GraphAdjList {
|
||||||
|
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率
|
||||||
|
// 请注意,adjList 中的元素是 Vertex 对象
|
||||||
adjList;
|
adjList;
|
||||||
|
|
||||||
/* 构造方法 */
|
/* 构造方法 */
|
||||||
constructor(edges) {
|
constructor(edges) {
|
||||||
this.adjList = new Map();
|
this.adjList = new Map();
|
||||||
@ -54,7 +57,7 @@ class GraphAdjList {
|
|||||||
/* 添加顶点 */
|
/* 添加顶点 */
|
||||||
addVertex(vet) {
|
addVertex(vet) {
|
||||||
if (this.adjList.has(vet)) return;
|
if (this.adjList.has(vet)) return;
|
||||||
// 在邻接表中添加一个新链表(即 HashSet)
|
// 在邻接表中添加一个新链表
|
||||||
this.adjList.set(vet, new Set());
|
this.adjList.set(vet, new Set());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,9 +66,9 @@ class GraphAdjList {
|
|||||||
if (!this.adjList.has(vet)) {
|
if (!this.adjList.has(vet)) {
|
||||||
throw new Error("Illegal Argument Exception");
|
throw new Error("Illegal Argument Exception");
|
||||||
}
|
}
|
||||||
// 在邻接表中删除顶点 vet 对应的链表(即 HashSet)
|
// 在邻接表中删除顶点 vet 对应的链表
|
||||||
this.adjList.delete(vet);
|
this.adjList.delete(vet);
|
||||||
// 遍历其它顶点的链表(即 HashSet),删除所有包含 vet 的边
|
// 遍历其它顶点的链表,删除所有包含 vet 的边
|
||||||
for (let set of this.adjList.values()) {
|
for (let set of this.adjList.values()) {
|
||||||
set.delete(vet);
|
set.delete(vet);
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ const { arrToTree } = require("../include/TreeNode");
|
|||||||
const { printTree } = require("../include/PrintUtil");
|
const { printTree } = require("../include/PrintUtil");
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
function hierOrder(root) {
|
function levelOrder(root) {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
let queue = [root];
|
let queue = [root];
|
||||||
// 初始化一个列表,用于保存遍历序列
|
// 初始化一个列表,用于保存遍历序列
|
||||||
@ -33,5 +33,5 @@ console.log("\n初始化二叉树\n");
|
|||||||
printTree(root);
|
printTree(root);
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
let list = hierOrder(root);
|
let list = levelOrder(root);
|
||||||
console.log("\n层序遍历的结点打印序列 = " + list);
|
console.log("\n层序遍历的结点打印序列 = " + list);
|
||||||
|
@ -10,7 +10,7 @@ from include import *
|
|||||||
|
|
||||||
|
|
||||||
""" 层序遍历 """
|
""" 层序遍历 """
|
||||||
def hier_order(root: Optional[TreeNode]):
|
def level_order(root: Optional[TreeNode]):
|
||||||
# 初始化队列,加入根结点
|
# 初始化队列,加入根结点
|
||||||
queue = collections.deque()
|
queue = collections.deque()
|
||||||
queue.append(root)
|
queue.append(root)
|
||||||
@ -35,6 +35,6 @@ if __name__ == "__main__":
|
|||||||
print_tree(root)
|
print_tree(root)
|
||||||
|
|
||||||
# 层序遍历
|
# 层序遍历
|
||||||
res = hier_order(root)
|
res = level_order(root)
|
||||||
print("\n层序遍历的结点打印序列 = ", res)
|
print("\n层序遍历的结点打印序列 = ", res)
|
||||||
assert res == [1, 2, 3, 4, 5, 6, 7]
|
assert res == [1, 2, 3, 4, 5, 6, 7]
|
||||||
|
@ -23,9 +23,11 @@ class Vertex: Hashable {
|
|||||||
|
|
||||||
/* 基于邻接表实现的无向图类 */
|
/* 基于邻接表实现的无向图类 */
|
||||||
class GraphAdjList {
|
class GraphAdjList {
|
||||||
// 请注意,vertices 和 adjList 中存储的都是 Vertex 对象
|
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率
|
||||||
private var adjList: [Vertex: Set<Vertex>] // 邻接表(使用哈希表实现)
|
// 请注意,adjList 中的元素是 Vertex 对象
|
||||||
|
private var adjList: [Vertex: Set<Vertex>]
|
||||||
|
|
||||||
|
/* 构造方法 */
|
||||||
init(edges: [[Vertex]]) {
|
init(edges: [[Vertex]]) {
|
||||||
adjList = [:]
|
adjList = [:]
|
||||||
// 添加所有顶点和边
|
// 添加所有顶点和边
|
||||||
@ -66,7 +68,7 @@ class GraphAdjList {
|
|||||||
if adjList[vet] != nil {
|
if adjList[vet] != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 在邻接表中添加一个新链表(即 HashSet)
|
// 在邻接表中添加一个新链表
|
||||||
adjList[vet] = []
|
adjList[vet] = []
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,9 +77,9 @@ class GraphAdjList {
|
|||||||
if adjList[vet] == nil {
|
if adjList[vet] == nil {
|
||||||
fatalError("参数错误")
|
fatalError("参数错误")
|
||||||
}
|
}
|
||||||
// 在邻接表中删除顶点 vet 对应的链表(即 HashSet)
|
// 在邻接表中删除顶点 vet 对应的链表
|
||||||
adjList.removeValue(forKey: vet)
|
adjList.removeValue(forKey: vet)
|
||||||
// 遍历其它顶点的链表(即 HashSet),删除所有包含 vet 的边
|
// 遍历其它顶点的链表,删除所有包含 vet 的边
|
||||||
for key in adjList.keys {
|
for key in adjList.keys {
|
||||||
adjList[key]?.remove(vet)
|
adjList[key]?.remove(vet)
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
import utils
|
import utils
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
func hierOrder(root: TreeNode) -> [Int] {
|
func levelOrder(root: TreeNode) -> [Int] {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
var queue: [TreeNode] = [root]
|
var queue: [TreeNode] = [root]
|
||||||
// 初始化一个列表,用于保存遍历序列
|
// 初始化一个列表,用于保存遍历序列
|
||||||
@ -36,7 +36,7 @@ enum BinaryTreeBFS {
|
|||||||
PrintUtil.printTree(root: node)
|
PrintUtil.printTree(root: node)
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
let list = hierOrder(root: node)
|
let list = levelOrder(root: node)
|
||||||
print("\n层序遍历的结点打印序列 = \(list)")
|
print("\n层序遍历的结点打印序列 = \(list)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,10 @@ class Vertex {
|
|||||||
|
|
||||||
/* 基于邻接表实现的无向图类 */
|
/* 基于邻接表实现的无向图类 */
|
||||||
class GraphAdjList {
|
class GraphAdjList {
|
||||||
|
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率
|
||||||
|
// 请注意,adjList 中的元素是 Vertex 对象
|
||||||
adjList: Map<Vertex, Set<Vertex>>;
|
adjList: Map<Vertex, Set<Vertex>>;
|
||||||
|
|
||||||
/* 构造方法 */
|
/* 构造方法 */
|
||||||
constructor(edges: Vertex[][]) {
|
constructor(edges: Vertex[][]) {
|
||||||
this.adjList = new Map();
|
this.adjList = new Map();
|
||||||
@ -54,7 +57,7 @@ class GraphAdjList {
|
|||||||
/* 添加顶点 */
|
/* 添加顶点 */
|
||||||
addVertex(vet: Vertex): void {
|
addVertex(vet: Vertex): void {
|
||||||
if (this.adjList.has(vet)) return;
|
if (this.adjList.has(vet)) return;
|
||||||
// 在邻接表中添加一个新链表(即 HashSet)
|
// 在邻接表中添加一个新链表
|
||||||
this.adjList.set(vet, new Set());
|
this.adjList.set(vet, new Set());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,9 +66,9 @@ class GraphAdjList {
|
|||||||
if (!this.adjList.has(vet)) {
|
if (!this.adjList.has(vet)) {
|
||||||
throw new Error("Illegal Argument Exception");
|
throw new Error("Illegal Argument Exception");
|
||||||
}
|
}
|
||||||
// 在邻接表中删除顶点 vet 对应的链表(即 HashSet)
|
// 在邻接表中删除顶点 vet 对应的链表
|
||||||
this.adjList.delete(vet);
|
this.adjList.delete(vet);
|
||||||
// 遍历其它顶点的链表(即 HashSet),删除所有包含 vet 的边
|
// 遍历其它顶点的链表,删除所有包含 vet 的边
|
||||||
for (let set of this.adjList.values()) {
|
for (let set of this.adjList.values()) {
|
||||||
set.delete(vet);
|
set.delete(vet);
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import { arrToTree } from '../module/TreeNode';
|
|||||||
import { printTree } from '../module/PrintUtil';
|
import { printTree } from '../module/PrintUtil';
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
function hierOrder(root: TreeNode | null): number[] {
|
function levelOrder(root: TreeNode | null): number[] {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
const queue = [root];
|
const queue = [root];
|
||||||
// 初始化一个列表,用于保存遍历序列
|
// 初始化一个列表,用于保存遍历序列
|
||||||
@ -35,7 +35,7 @@ console.log('\n初始化二叉树\n');
|
|||||||
printTree(root);
|
printTree(root);
|
||||||
|
|
||||||
/* 层序遍历 */
|
/* 层序遍历 */
|
||||||
const list = hierOrder(root);
|
const list = levelOrder(root);
|
||||||
console.log('\n层序遍历的结点打印序列 = ' + list);
|
console.log('\n层序遍历的结点打印序列 = ' + list);
|
||||||
|
|
||||||
export {};
|
export {};
|
||||||
|
@ -6,7 +6,7 @@ const std = @import("std");
|
|||||||
const inc = @import("include");
|
const inc = @import("include");
|
||||||
|
|
||||||
// 层序遍历
|
// 层序遍历
|
||||||
fn hierOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {
|
fn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {
|
||||||
// 初始化队列,加入根结点
|
// 初始化队列,加入根结点
|
||||||
const L = std.TailQueue(*inc.TreeNode(T));
|
const L = std.TailQueue(*inc.TreeNode(T));
|
||||||
var queue = L{};
|
var queue = L{};
|
||||||
@ -48,7 +48,7 @@ pub fn main() !void {
|
|||||||
try inc.PrintUtil.printTree(root, null, false);
|
try inc.PrintUtil.printTree(root, null, false);
|
||||||
|
|
||||||
// 层序遍历
|
// 层序遍历
|
||||||
var list = try hierOrder(i32, mem_allocator, root.?);
|
var list = try levelOrder(i32, mem_allocator, root.?);
|
||||||
defer list.deinit();
|
defer list.deinit();
|
||||||
std.debug.print("\n层序遍历的结点打印序列 = ", .{});
|
std.debug.print("\n层序遍历的结点打印序列 = ", .{});
|
||||||
inc.PrintUtil.printList(i32, list);
|
inc.PrintUtil.printList(i32, list);
|
||||||
|
Loading…
Reference in New Issue
Block a user