Sobes.tech
Middle

Чӣ гуна ҷустуҷӯ дар дарахт кор мекунад?

sobes.tech AI

Ҷавоб аз AI

Ҷустуҷӯ дар дарахт вобаста ба сохтор ва ҳадафи ҷустуҷӯ мебошад.

Роҳҳои асосии ҷустуҷӯ:

  1. Ҷустуҷӯи дарозо (DFS - Depth-First Search): Ба қадри имкон дар як шоха то дараҷаи максималӣ меравад, пеш аз гузаштан ба шохаи ҳамсоя. Бо истифода аз стек (равшан ё тавассути рекурсия) иҷро мешавад.

    • Ташриҳи пеш (Pre-order): Гузаронидани реша, сипас зери дарахти чап, сипас зери дарахти рост.
    • Ташриҳи дарун (In-order): Гузаронидани зери дарахти чап, сипас реша, сипас зери дарахти рост. Ин барои гирифтани рӯйхати мунтазами унсурҳо дар дарахтони ҷустуҷӯии дукарата истифода мешавад.
    • Ташриҳи пас (Post-order): Гузаронидани зери дарахти чап, сипас зери дарахти рост, сипас реша.
  2. Ҷустуҷӯи паҳлӯӣ (BFS - Breadth-First Search): Ҳамаи ҳамсояҳоро дар як сатҳ меҷӯяд, пеш аз гузаштан ба сатҳи нав. Бо истифода аз навбат иҷро мешавад.

Маслиҳат барои DFS (In-order) барои дарахти дукарата:

// TreeNode нишон медиҳад, ки чӣ гуна узели дарахти дукарата аст
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// InOrderTraversal иҷро мекунад гузариши дарунӣ
func InOrderTraversal(root *TreeNode) []int {
	var result []int
	if root == nil {
		return result
	}

	// Даъвоии рекурсивӣ барои зери дарахти чап
	result = append(result, InOrderTraversal(root.Left)...)
	// Визит кардани узели ҳозира
	result = append(result, root.Val)
	// Даъвоии рекурсивӣ барои зери дарахти рост
	result = append(result, InOrderTraversal(root.Right)...)

	return result
}

Маслиҳат барои BFS:

// TreeNode нишон медиҳад, ки чӣ гуна узели дарахти дукарата аст
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// BFSTraversal иҷро мекунад гузариши BFS
func BFSTraversal(root *TreeNode) []int {
	var result []int
	if root == nil {
		return result
	}

	// Навбат барои нигоҳ доштани узелҳо дар сатҳи ҳозира
	queue := []*TreeNode{root}

	for len(queue) > 0 {
		// Гирифтани аввалин унсур аз навбат
		node := queue[0]
		queue = queue[1:]

		// Илова кардани арзиши узел ба натиҷа
		result = append(result, node.Val)

		// Илова кардани фарзанди чап, агар вуҷуд дошта бошад
		if node.Left != nil {
			queue = append(queue, node.Left)
		}
		// Илова кардани фарзанди рост, агар вуҷуд дошта бошад
		if node.Right != nil {
			queue = append(queue, node.Right)
		}
	}
	return result
}

Барои дарахтони ҷустуҷӯии дукарата (BST), ки дар он зери дарахт хурдтар аз реша ва болоӣ калонтар:

  1. Ҷустуҷӯи дукарата: Вақте ки арзиши муайянро меҷӯем, онро бо реша муқоиса мекунем. Агар хурдтар бошад, дар зери дарахт меҷӯем; агар калонтар бошад, дар боло. Ин стратегияи самараноктарин барои ҷустуҷӯи дар BST мебошад.
// TreeNode нишон медиҳад, ки чӣ гуна узели дарахти дукарата барои ҷустуҷӯ
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// SearchBST иҷро мекунад ҷустуҷӯи дукарата дар BST
func SearchBST(root *TreeNode, target int) *TreeNode {
	if root == nil || root.Val == target {
		return root // Узели ёфт шуд ё дарахт холӣ аст
	}

	if target < root.Val {
		// Ҷустуҷӯ дар зери дарахт
		return SearchBST(root.Left, target)
	}
	// Ҷустуҷӯ дар зери дарахт
	return SearchBST(root.Right, target)
}

Интихоби алгоритми ҷустуҷӯ вобаста ба вазифа ва хусусиятҳои дарахт мебошад. DFS барои гузариш дароз ва ё ёфтани роҳ ба ҳадаф мувофиқ аст. BFS барои ёфтани кӯтоҳтарин роҳ ё гузариш дар сатҳҳо мувофиқ аст. Ҷустуҷӯи дукарата самаранок аст барои ёфтани арзиши мушаххас дар структураҳои ба тартиб дароварда, мисли BST.