From 6917e63da32c8f2a62ad8d959d855df5f7be978e Mon Sep 17 00:00:00 2001 From: oldcorvus Date: Fri, 18 Aug 2023 12:12:09 +0330 Subject: [PATCH] Add tree data structure --- ....1- data structures (queue-stack-lists).md | 158 +++++++++++++++++- 1 file changed, 157 insertions(+), 1 deletion(-) diff --git a/content/chapter 10/10.1- data structures (queue-stack-lists).md b/content/chapter 10/10.1- data structures (queue-stack-lists).md index f995e0903..7a60f4f41 100644 --- a/content/chapter 10/10.1- data structures (queue-stack-lists).md +++ b/content/chapter 10/10.1- data structures (queue-stack-lists).md @@ -1,5 +1,5 @@ -در این قسمت به بررسی مواردی مهم از سختمان داده در زبان گو می‌پردازیم و این آموزش مناسب افرادی هست که با مباحث ساختمان داده آشنایی داشته باشند. +در این قسمت به بررسی مواردی مهم از ساختمان داده در زبان گو می‌پردازیم و این آموزش مناسب افرادی هست که با مباحث ساختمان داده آشنایی داشته باشند. ## 10.1.1 Queue in Golang @@ -775,3 +775,159 @@ value = A, prev = , next = &{B 0xc000070060 0xc000070020} ``` +## 10.1.5 Tree in Go + +درخت به عنوان یک ساختمان داده غیرخطی تعریف می‌شود که از مجموعه‌ای از گره‌ها تشکیل شده است، و این گره‌ها توسط یال‌ها به یکدیگر متصل شده‌اند + +خواص یک درخت: + +- درخت از یک گره ریشه و صفر یا چند درخت فرعی متصل به آن تشکیل شده است +- گره ریشه بالاترین گره درخت است +- گره‌های برگ گره‌هایی هستند که هیچ فرزندی ندارند +- عمق یک گره تعداد یال‌ها بین ریشه و خودش است +- ارتفاع یک گره تعداد یال‌ها بین خودش و دورترین گره برگ در زیردرخت خود است + +‍‍ +```go +package main + +import "fmt" + +// Tree represents a tree structure. +type Tree struct { + root *TreeNode +} + +// TreeNode represents a node in the tree. +type TreeNode struct { + data int + children []*TreeNode +} + +// insertTree adds a new node with the given data as the root node of the tree. +func (tree *Tree) insertTree(data int) { + if tree.root == nil { + tree.root = &TreeNode{data: data} + } +} + +// InsertNode adds a new node with the given data as a child of the specified node. +func (node *TreeNode) insertNode(data int) *TreeNode { + newNode := &TreeNode{data: data} + node.children = append(node.children, newNode) + return newNode +} + +// deleteTree removes the specified node, starting from the root of the tree. +func (tree *Tree) deleteFromRoot(nodeToDelete *TreeNode) { + tree.root = tree.root.deleteNode(nodeToDelete) +} + +// deleteNode recursively removes the specified node and its descendants from the current node's children. +func (node TreeNode) deleteNode(nodeToDelete *TreeNode) *TreeNode { + var updatedChildren []*TreeNode + for _, child := range node.children { + + if child != nodeToDelete { + updatedChildren = append(updatedChildren, child.deleteNode(nodeToDelete)) + } + } + + node.children = updatedChildren + return &node +} + +// traverseFromRoot initiates a traversal of the tree starting from the root node. +func (tree *Tree) traverseFromRoot() { + tree.root.traverse() +} + +// searchFromRoot searches for a node with the specified data starting from the tree's root. +func (tree *Tree) searchFromRoot(data int) *TreeNode { + if tree.root != nil { + node := tree.root.searchFromNode(data) + return node + } + + return nil +} + +// searchFromNode searches for a node with the specified data starting from the current node. +func (node *TreeNode) searchFromNode(data int) *TreeNode { + if node.data == data { + return node + } + for _, child := range node.children { + if foundNode := child.searchFromNode(data); foundNode != nil { + return foundNode + } + } + + return nil +} +// traverse performs a recursive traversal starting from the current node. +func (node *TreeNode) traverse() { + if node == nil { + return + } + + fmt.Printf("%d ", node.data) + for _, child := range node.children { + child.traverse() + } +} + +func main() { + // Creating a Tree instance + tree := Tree{} + + // Inserting nodes + tree.insertTree(1) + tree.root.insertNode(2) + node3 := tree.root.insertNode(3) + node4 := tree.root.insertNode(4) + node3.insertNode(5) + node3.insertNode(6) + node4.insertNode(7) + + // Traversing and printing nodes + fmt.Println("Traverse from root:") + tree.root.traverse() + + // Searching for node + fmt.Println("\nSearch for node 3:") + node := tree.searchFromRoot(3) + if node != nil { + fmt.Println("node found") + } else { + fmt.Println("node not found") + } + + fmt.Println("Search for node 8:") + node8 := tree.searchFromRoot(8) + if node8 != nil { + fmt.Println("node found") + } else { + fmt.Println("node not found") + } + + // Deleting a node + fmt.Println("After deleting node 3:") + tree.deleteFromRoot(node3) + tree.root.traverse() +} + +``` + +خروجی برنامه بالا: + +```go +Traverse from root: +1 2 3 5 6 4 7 +Search for node 3 +node found +Search for node 8 +node not found +After deleting node 3: +1 2 4 7 +``` \ No newline at end of file