Skip to content

Commit

Permalink
Merge pull request #283 from oldcorvus/main
Browse files Browse the repository at this point in the history
Add tree data structure
  • Loading branch information
Ja7ad authored Aug 18, 2023
2 parents 6c0c13c + 6917e63 commit 2bbab78
Showing 1 changed file with 157 additions and 1 deletion.
158 changes: 157 additions & 1 deletion content/chapter 10/10.1- data structures (queue-stack-lists).md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

در این قسمت به بررسی مواردی مهم از سختمان داده در زبان گو می‌پردازیم و این آموزش مناسب افرادی هست که با مباحث ساختمان داده آشنایی داشته باشند.
در این قسمت به بررسی مواردی مهم از ساختمان داده در زبان گو می‌پردازیم و این آموزش مناسب افرادی هست که با مباحث ساختمان داده آشنایی داشته باشند.

## 10.1.1 Queue in Golang

Expand Down Expand Up @@ -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
```

0 comments on commit 2bbab78

Please sign in to comment.