Kuidas töötab puu otsing?
sobes.tech AI
Vastus AI-lt
Otsing tree'is sõltub selle struktuurist ja otsingu eesmärgist.
Peamised otsingusüüdemed:
-
Sügavusotsing (DFS - Depth-First Search): liigub maksimaalselt sügavale ühe haru, enne kui liigub teise juurde. Rakendatakse virna (otseselt või rekursiooni kaudu).
- Eelkäigu läbimine (Pre-order): külastada juuri, siis vasakut puud, siis paremat puud.
- In-order läbimine (In-order): külastada vasakut puud, siis juuri, siis paremat puud. Kasutatakse sorteeritud elementide nimekirja saamiseks binaarsetest otsingupuu struktuuridest.
- Pärastläbimine (Post-order): külastada vasakut puud, siis paremat puud, siis juuri.
-
Laiusotsing (BFS - Breadth-First Search): uurib kõiki naabreid samal tasemel enne järgmisele tasemele liikumist. Rakendatakse järjekorra abil.
Näide DFS (In-order) binaarpuu jaoks:
// TreeNode esindab binaarpuu sõlme
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// InOrderTraversal teostab inorder läbimise
func InOrderTraversal(root *TreeNode) []int {
var result []int
if root == nil {
return result
}
// Rekursiivne kõne vasakule alampuule
result = append(result, InOrderTraversal(root.Left)...)
// Külasta praegune sõlm
result = append(result, root.Val)
// Rekursiivne kõne paremale alampuule
result = append(result, InOrderTraversal(root.Right)...)
return result
}
Näide BFS:
// TreeNode esindab binaarpuu sõlme
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// BFSTraversal teostab BFS läbimise
func BFSTraversal(root *TreeNode) []int {
var result []int
if root == nil {
return result
}
// järjekord, mis hoiab taseme sõlmi
queue := []*TreeNode{root}
for len(queue) > 0 {
// esimese elemendi eemaldamine järjekorrast
node := queue[0]
queue = queue[1:]
// sõlme väärtuse lisamine tulemusele
result = append(result, node.Val)
// vasak lapse lisamine järjekorda, kui see eksisteerib
if node.Left != nil {
queue = append(queue, node.Left)
}
// parema lapse lisamine järjekorda, kui see eksisteerib
if node.Right != nil {
queue = append(queue, node.Right)
}
}
return result
}
Binara otsingupuu (BST), kus vasak alam on väiksem juurest ja parem suurem:
- Binārā meklēšana: meklides konkreetset väärtust, võrdleme seda juurega. Kui väärtus on väiksem, otsime vasakult; kui suurem, paremal. See on kõige tõhusam otsingustrateegia BST-s.
// TreeNode esindab binaarset otsingupuu sõlme
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// SearchBST teostab binaarset otsingut BST-s
func SearchBST(root *TreeNode, target int) *TreeNode {
if root == nil || root.Val == target {
return root // sõlm leitud või puu on tühi
}
if target < root.Val {
// otsing vasakult
return SearchBST(root.Left, target)
}
// otsing paremal
return SearchBST(root.Right, target)
}
Otsingualgoritmi valik sõltub ülesandest ja puu omadustest. DFS sobib, kui vaja on sügavalt läbi minna või leida tee sihile. BFS sobib lühima tee otsimiseks või tasemete läbivaatuseks. Binārset otsingut on tõhus, kui otsitav väärtus on sorteeritud struktuurides, nagu BST.