Advertisement
Alexxik

Untitled

Mar 18th, 2024 (edited)
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.03 KB | None | 0 0
  1. // Даны 2 ноды нужно найти их ближайшего общего предка
  2.  
  3. // мы будем использовать рекурсивный обход дерева, чтобы найти путь от корня до каждого из узлов, а затем сравним эти пути, чтобы найти последний общий элемент
  4.  
  5. class TreeNode {
  6.     var val: Int
  7.     var left: TreeNode?
  8.     var right: TreeNode?
  9.    
  10.     init(_ val: Int) {
  11.         self.val = val
  12.         self.left = nil
  13.         self.right = nil
  14.     }
  15. }
  16.  
  17. // Функция для поиска пути от корня до заданного узла
  18. func findPath(_ root: TreeNode?, _ node: TreeNode, _ path: inout [TreeNode]) -> Bool {
  19.     if root == nil {
  20.         return false
  21.     }
  22.    
  23.     // Добавляем текущий узел в путь
  24.     path.append(root!)
  25.    
  26.     // Если текущий узел - целевой узел, возвращаем true
  27.     if root === node {
  28.         return true
  29.     }
  30.    
  31.     // Проверяем, присутствует ли целевой узел в левом или правом поддереве
  32.     if findPath(root?.left, node, &path) || findPath(root?.right, node, &path) {
  33.         return true
  34.     }
  35.    
  36.     // Если целевой узел не найден в поддереве, удаляем текущий узел из пути и возвращаем false
  37.     path.removeLast()
  38.     return false
  39. }
  40.  
  41. // Функция для нахождения ближайшего общего предка
  42. func closestCommonAncestor(_ root: TreeNode?, _ p: TreeNode, _ q: TreeNode) -> TreeNode? {
  43.     var pathP = [TreeNode]()
  44.     var pathQ = [TreeNode]()
  45.    
  46.     // Находим пути от корня до узлов p и q
  47.     guard findPath(root, p, &pathP) && findPath(root, q, &pathQ) else {
  48.         return nil
  49.     }
  50.    
  51.     // Сравниваем пути для нахождения последнего общего узла
  52.     var i = 0
  53.     while i < pathP.count && i < pathQ.count && pathP[i] === pathQ[i] {
  54.         i += 1
  55.     }
  56.    
  57.     // Возвращаем последний общий узел
  58.     return i > 0 ? pathP[i - 1] : nil
  59. }
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67. // Пример использования:
  68. // Создаем бинарное дерево
  69. let root = TreeNode(3)
  70. root.left = TreeNode(5)
  71. root.right = TreeNode(1)
  72. root.left?.left = TreeNode(6)
  73. root.left?.right = TreeNode(2)
  74. root.left?.right?.left = TreeNode(7)
  75. root.left?.right?.right = TreeNode(4)
  76. root.right?.left = TreeNode(0)
  77. root.right?.right = TreeNode(8)
  78.  
  79. let p = root.left?.left // Узел со значением 6
  80. let q = root.left?.right?.right // Узел со значением 4
  81.  
  82. // Находим ближайшего общего предка
  83. if let ancestor = closestCommonAncestor(root, p!, q!) {
  84.     print("Ближайший общий предок:", ancestor.val)
  85. } else {
  86.     print("Общий предок не найден.")
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement