Merge pull request #20 from Reanon/feature/suppor-go-include
feat(go): support basic pkg
This commit is contained in:
		
							
								
								
									
										35
									
								
								codes/go/chapter_searching/linear_search.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								codes/go/chapter_searching/linear_search.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| // File: linear_search.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package chapter_searching | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/krahets/hello-algo/pkg" | ||||
| ) | ||||
|  | ||||
| // linerSearchArray 线性查找(数组) | ||||
| func linerSearchArray(nums []int, target int) int { | ||||
| 	// 遍历数组 | ||||
| 	for i := 0; i < len(nums); i++ { | ||||
| 		if nums[i] == target { | ||||
| 			// 找到目标元素,返回其索引 | ||||
| 			return i | ||||
| 		} | ||||
| 	} | ||||
| 	// 未找到目标元素,返回 -1 | ||||
| 	return -1 | ||||
| } | ||||
|  | ||||
| // linerSearchLinkedList 线性查找(链表) | ||||
| func linerSearchLinkedList(node *ListNode, target int) *ListNode { | ||||
| 	// 遍历链表 | ||||
| 	for node != nil { | ||||
| 		if node.Val == target { | ||||
| 			return node | ||||
| 		} | ||||
| 		node = node.Next | ||||
| 	} | ||||
| 	// 未找到目标元素,返回 nil | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										24
									
								
								codes/go/chapter_searching/linear_search_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								codes/go/chapter_searching/linear_search_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| // File: linear_search_test.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package chapter_searching | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/krahets/hello-algo/pkg" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestLinearSearch(t *testing.T) { | ||||
| 	target := 3 | ||||
| 	nums := []int{1, 5, 3, 2, 4, 7, 5, 9, 10, 8} | ||||
|  | ||||
| 	// 在数组中执行线性查找 | ||||
| 	index := linerSearchArray(nums, target) | ||||
| 	t.Log("目标元素 3 的索引 = ", index) | ||||
|  | ||||
| 	// 在链表中执行线性查找 | ||||
| 	head := ArrayToLinkedList(nums) | ||||
| 	node := linerSearchLinkedList(head, target) | ||||
| 	t.Log("目标结点值 3 的对应结点对象为 ", node) | ||||
| } | ||||
							
								
								
									
										20
									
								
								codes/go/chapter_tree/binary_search_tree.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								codes/go/chapter_tree/binary_search_tree.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| // File: binary_search_tree.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package chapter_tree | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/krahets/hello-algo/pkg" | ||||
| 	"sort" | ||||
| ) | ||||
|  | ||||
| type BinarySearchTree struct { | ||||
| 	root *TreeNode | ||||
| } | ||||
|  | ||||
| func NewBinarySearchTree(nums []int) *BinarySearchTree { | ||||
| 	// 排序数组 | ||||
| 	sort.Ints(nums) | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										23
									
								
								codes/go/chapter_tree/binary_tree.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								codes/go/chapter_tree/binary_tree.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| // File: binary_tree.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package chapter_tree | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/krahets/hello-algo/pkg" | ||||
| ) | ||||
|  | ||||
| type BinaryTree struct { | ||||
| 	root *TreeNode | ||||
| } | ||||
|  | ||||
| func NewBinaryTree(node *TreeNode) *BinaryTree { | ||||
| 	return &BinaryTree{ | ||||
| 		root: node, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (tree *BinaryTree) Print() { | ||||
| 	PrintTree(tree.root) | ||||
| } | ||||
							
								
								
									
										40
									
								
								codes/go/chapter_tree/binary_tree_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								codes/go/chapter_tree/binary_tree_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| // File: binary_tree_test.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package chapter_tree | ||||
|  | ||||
| import ( | ||||
| 	. "github.com/krahets/hello-algo/pkg" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestBinaryTree(t *testing.T) { | ||||
| 	/* 初始化二叉树 */ | ||||
| 	// 初始化节点 | ||||
| 	n1 := NewTreeNode(1) | ||||
| 	n2 := NewTreeNode(2) | ||||
| 	n3 := NewTreeNode(3) | ||||
| 	n4 := NewTreeNode(4) | ||||
| 	n5 := NewTreeNode(5) | ||||
|  | ||||
| 	tree := NewBinaryTree(n1) | ||||
| 	n1.Left = n2 | ||||
| 	n1.Right = n3 | ||||
| 	n2.Left = n4 | ||||
| 	n2.Right = n5 | ||||
| 	t.Log("初始化二叉树") | ||||
| 	tree.Print() | ||||
|  | ||||
| 	/* 插入与删除结点 */ | ||||
| 	p := NewTreeNode(0) | ||||
| 	n1.Left = p | ||||
| 	p.Left = n2 | ||||
| 	t.Log("插入结点 P 后") | ||||
| 	tree.Print() | ||||
|  | ||||
| 	// 删除结点 | ||||
| 	n1.Left = n2 | ||||
| 	t.Log("删除结点 P 后") | ||||
| 	tree.Print() | ||||
| } | ||||
							
								
								
									
										59
									
								
								codes/go/pkg/list_node.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								codes/go/pkg/list_node.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| // File: list_node.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package pkg | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // ListNode Definition for a singly-linked list node | ||||
| type ListNode struct { | ||||
| 	Next *ListNode | ||||
| 	Val  int | ||||
| } | ||||
|  | ||||
| // NewListNode Generate a list node with an val | ||||
| func NewListNode(v int) *ListNode { | ||||
| 	return &ListNode{ | ||||
| 		Next: nil, | ||||
| 		Val:  v, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ArrayToLinkedList Generate a linked list with an array | ||||
| func ArrayToLinkedList(arr []int) *ListNode { | ||||
| 	// dummy header of linked list | ||||
| 	dummy := NewListNode(0) | ||||
| 	node := dummy | ||||
| 	for _, val := range arr { | ||||
| 		node.Next = NewListNode(val) | ||||
| 		node = node.Next | ||||
| 	} | ||||
| 	return dummy.Next | ||||
| } | ||||
|  | ||||
| // GetListNode Get a list node with specific value from a linked list | ||||
| func GetListNode(node *ListNode, val int) *ListNode { | ||||
| 	for node != nil && node.Val != val { | ||||
| 		node = node.Next | ||||
| 	} | ||||
| 	return node | ||||
| } | ||||
|  | ||||
| // PrintLinkedList Print a linked list | ||||
| func PrintLinkedList(node *ListNode) { | ||||
| 	if node == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	var builder strings.Builder | ||||
| 	for node.Next != nil { | ||||
| 		builder.WriteString(strconv.Itoa(node.Val) + " -> ") | ||||
| 		node = node.Next | ||||
| 	} | ||||
| 	builder.WriteString(strconv.Itoa(node.Val)) | ||||
| 	fmt.Println(builder.String()) | ||||
| } | ||||
							
								
								
									
										16
									
								
								codes/go/pkg/list_node_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								codes/go/pkg/list_node_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| // File: list_node_test.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package pkg | ||||
|  | ||||
| import "testing" | ||||
|  | ||||
| func TestListNode(t *testing.T) { | ||||
| 	arr := []int{2, 3, 5, 6, 7} | ||||
| 	head := ArrayToLinkedList(arr) | ||||
|  | ||||
| 	PrintLinkedList(head) | ||||
| 	node := GetListNode(head, 5) | ||||
| 	t.Log("Find node: ", node.Val) | ||||
| } | ||||
							
								
								
									
										127
									
								
								codes/go/pkg/tree_node.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								codes/go/pkg/tree_node.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| // File: tree_node.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package pkg | ||||
|  | ||||
| import ( | ||||
| 	"container/list" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| type TreeNode struct { | ||||
| 	Val   int | ||||
| 	Left  *TreeNode | ||||
| 	Right *TreeNode | ||||
| } | ||||
|  | ||||
| func NewTreeNode(v int) *TreeNode { | ||||
| 	return &TreeNode{ | ||||
| 		Left:  nil, | ||||
| 		Right: nil, | ||||
| 		Val:   v, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ArrayToTree Generate a binary tree with an array | ||||
| func ArrayToTree(arr []int) *TreeNode { | ||||
| 	if len(arr) <= 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	root := NewTreeNode(arr[0]) | ||||
| 	// Let container.list as queue | ||||
| 	queue := list.New() | ||||
| 	queue.PushBack(root) | ||||
| 	i := 1 | ||||
| 	for queue.Len() > 0 { | ||||
| 		// poll | ||||
| 		node := queue.Remove(queue.Front()).(*TreeNode) | ||||
| 		if i < len(arr) { | ||||
| 			node.Left = NewTreeNode(arr[i]) | ||||
| 			queue.PushBack(node.Left) | ||||
| 			i++ | ||||
| 		} | ||||
| 		if i < len(arr) { | ||||
| 			node.Right = NewTreeNode(arr[i]) | ||||
| 			queue.PushBack(node.Right) | ||||
| 			i++ | ||||
| 		} | ||||
| 	} | ||||
| 	return root | ||||
| } | ||||
|  | ||||
| // TreeToArray Serialize a binary tree to a list | ||||
| func TreeToArray(root *TreeNode) []int { | ||||
| 	if root == nil { | ||||
| 		return []int{} | ||||
| 	} | ||||
| 	arr := make([]int, 16) | ||||
| 	queue := list.New() | ||||
| 	queue.PushBack(root) | ||||
| 	for queue.Len() > 0 { | ||||
| 		node := queue.Remove(queue.Front()).(*TreeNode) | ||||
| 		if node != nil { | ||||
| 			arr = append(arr, node.Val) | ||||
| 			queue.PushBack(node.Left) | ||||
| 			queue.PushBack(node.Right) | ||||
| 		} else { | ||||
| 			arr = append(arr, -1) | ||||
| 		} | ||||
| 	} | ||||
| 	return arr | ||||
| } | ||||
|  | ||||
| // PrintTree Print a binary tree | ||||
| func PrintTree(root *TreeNode) { | ||||
| 	PrintTreeHelper(root, nil, false) | ||||
| } | ||||
|  | ||||
| // PrintTreeHelper Help to print a binary tree, hide more details | ||||
| // This tree printer is borrowed from TECHIE DELIGHT | ||||
| // https://www.techiedelight.com/c-program-print-binary-tree/ | ||||
| func PrintTreeHelper(root *TreeNode, prev *trunk, isLeft bool) { | ||||
| 	if root == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	prevStr := "    " | ||||
| 	trunk := newTrunk(prev, prevStr) | ||||
| 	PrintTreeHelper(root.Right, trunk, true) | ||||
| 	if prev == nil { | ||||
| 		trunk.str = "———" | ||||
| 	} else if isLeft { | ||||
| 		trunk.str = "/———" | ||||
| 		prevStr = "   |" | ||||
| 	} else { | ||||
| 		trunk.str = "\\———" | ||||
| 		prev.str = prevStr | ||||
| 	} | ||||
| 	showTrunk(trunk) | ||||
| 	fmt.Println(root.Val) | ||||
| 	if prev != nil { | ||||
| 		prev.str = prevStr | ||||
| 	} | ||||
| 	trunk.str = "   |" | ||||
| 	PrintTreeHelper(root.Left, trunk, false) | ||||
| } | ||||
|  | ||||
| // trunk Help to Print tree structure | ||||
| type trunk struct { | ||||
| 	prev *trunk | ||||
| 	str  string | ||||
| } | ||||
|  | ||||
| func newTrunk(prev *trunk, str string) *trunk { | ||||
| 	return &trunk{ | ||||
| 		prev: prev, | ||||
| 		str:  str, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func showTrunk(t *trunk) { | ||||
| 	if t == nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	showTrunk(t.prev) | ||||
| 	fmt.Print(t.str) | ||||
| } | ||||
							
								
								
									
										15
									
								
								codes/go/pkg/tree_node_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								codes/go/pkg/tree_node_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| // File: tree_node_test.go | ||||
| // Created Time: 2022-11-25 | ||||
| // Author: Reanon (793584285@qq.com) | ||||
|  | ||||
| package pkg | ||||
|  | ||||
| import "testing" | ||||
|  | ||||
| func TestTreeNode(t *testing.T) { | ||||
| 	arr := []int{2, 3, 5, 6, 7} | ||||
| 	node := ArrayToTree(arr) | ||||
|  | ||||
| 	// print tree | ||||
| 	PrintTree(node) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user