logo

BST'nin iki düğümü arasındaki maksimum öğe

Bir dizi göz önüne alındığında N elemanlar ve iki tam sayı bir b verilen diziye ait olanlar. Bir oluştur İkili Arama Ağacı elemanları ekleyerek arr[0]'dan arr[n-1]'e . Görev bulmaktır maksimum a'dan b'ye giden yoldaki öğe.

Örnek:

Giriş : varış[] = { 18 36 9 6 12 10 1 8 } a = 1 b = 10.
Çıkış : 12



BST'nin iki düğümü arasındaki maksimum eleman' title=

Açıklama: Yol: 1'den 10'a içerir { 1 6 9 12 10 } . Maksimum eleman 12'dir.

İçerik Tablosu

[Saf yaklaşım] Hashing kullanma - O(n * log n) Zaman ve O(n) Uzay

Fikir bir kullanmaktır hash haritası depolamak için ebeveyn her düğümün düğümü ikili arama ağacı . Her iki verilen düğümden başlayabilir ve karşılaşılan düğümleri saklayan ağaçta yukarıya doğru gidebiliriz. ayarlamak . İki düğümün köküne veya ortak atasına ulaştığımızda, her düğümden ağaçta aşağıya doğru ilerleyebilir ve maksimum düğüm kümesinde karşılaşılan öğe.

java dizeye int döktü

Yukarıdaki yaklaşım için algoritma adımları:

  • Boş oluştur karma tablosu depolamak için ebeveyn İkili arama ağacındaki her düğümün düğümü.
  • Bir gerçekleştirin derinlik öncelikli arama (DFS) ikili arama ağacının geçişini yapın ve karma tablosunu her düğümün ana düğümüyle doldurun.
  • İki işaretçiyi başlat diyor p1 ve p2 verilen düğümlere.
  • İki boş kümeyi başlat diyorlar s1 ve s2 ağaçtan yukarıya doğru giderken karşılaşılan düğümleri depolamak için p1 ve p2 sırasıyla.
  • Sırasında p1 ve p2 öyle eşit değil aşağıdakileri yapın:
    • p1 değilse hükümsüz s1'i ayarlamak için ekleyin ve güncelleme p1'i karma tablosunu kullanarak üst düğümüne aktarın.
    • p2 değilse hükümsüz s2'yi ayarlamak için ekleyin ve güncelleme p2'yi karma tablosunu kullanarak üst düğümüne aktarın.
  • kesişim kümesini bulun s1 ve s2 yani hem s1 hem de s2 için ortak olan düğümler kümesi.
  • Bu kavşakta bul maksimum öğeyi seçin ve geri gönderin.

Yukarıdaki yaklaşımın uygulanması aşağıdadır:

C++
// C++ program to find maximum element in the path // between two Nodes of Binary Search Tree. #include    using namespace std; class Node { public:   int data;  Node *left *right;    Node(int x) {  data = x;  left = right = nullptr;  } }; // Insert a new Node in Binary Search Tree void insertNode(Node *&root int x) {  Node *current = root *parent = nullptr;    // Traverse to the correct position for insertion  while (current != nullptr) {  parent = current;  if (x < current->data)  current = current->left;  else  current = current->right;  }  // Insert new Node at the correct position  if (parent == nullptr)  root = new Node(x);   else if (x < parent->data)  parent->left = new Node(x);  else  parent->right = new Node(x); } // DFS to populate parent map for each node void dfs(Node *root unordered_map<Node* Node*> &parentMap  Node *parent = nullptr) {  if (!root) return;  // Store the parent of the current node  if (parent != nullptr) {  parentMap[root] = parent;  }  // Recur for left and right children  dfs(root->left parentMap root);  dfs(root->right parentMap root); } // Function to find the node with the given value in the BST Node* findNode(Node *root int val) {  if (!root) return nullptr;  if (root->data == val)  return root;  Node *leftResult = findNode(root->left val);  if (leftResult) return leftResult;  return findNode(root->right val); } // Find maximum element in the path between two nodes in BST int findMaxElement(Node *root int x int y) {  unordered_map<Node* Node*> parentMap;    // Populate parent map with DFS  dfs(root parentMap);   // Find the nodes corresponding to the   // values x and y  Node *p1 = findNode(root x);  Node *p2 = findNode(root y);    // If nodes not found  if (!p1 || !p2) return -1;   // Sets to store nodes encountered   // while traversing up the tree  unordered_set<Node*> s1 s2;  // Variable to store the maximum   // element in the path  int maxElement = INT_MIN;  // Traverse up the tree from p1 and p2   // and add nodes to sets s1 and s2  while (p1 != p2) {  if (p1) {  s1.insert(p1);  maxElement = max(maxElement p1->data);    // Move to parent node  p1 = parentMap[p1];   }  if (p2) {  s2.insert(p2);  maxElement = max(maxElement p2->data);  p2 = parentMap[p2];   }  // Check if there's a common node  // in both sets  if (s1.count(p2)) break;  if (s2.count(p1)) break;  }  // Now both p1 and p2 point to their Lowest  // Common Ancestor (LCA)  maxElement = max(maxElement p1->data);  return maxElement; } int main() {    vector<int> arr = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  int n = arr.size();    Node *root = new Node(arr[0]);  for (int i = 1; i < n; i++)  insertNode(root arr[i]);  cout << findMaxElement(root a b) << endl;  return 0; } 
Java
// Java program to find the maximum element in the path // between two Nodes of Binary Search Tree. import java.util.*; class Node {  int data;  Node left right;  Node(int x) {  data = x;  left = right = null;  } } class GfG {    // Insert a new Node in Binary Search Tree  static void insertNode(Node root int x) {  Node current = root parent = null;  // Traverse to the correct position   // for insertion  while (current != null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct position  if (parent == null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x);  }  // DFS to populate parent map for each node  static void dfs(Node root Map<Node Node> parentMap  Node parent) {  if (root == null)  return;  // Store the parent of the current node  if (parent != null) {  parentMap.put(root parent);  }  // Recur for left and right children  dfs(root.left parentMap root);  dfs(root.right parentMap root);  }  // Function to find the node with the given  // value in the BST  static Node findNode(Node root int val) {  if (root == null)  return null;  if (root.data == val)  return root;  Node leftResult = findNode(root.left val);  if (leftResult != null)  return leftResult;  return findNode(root.right val);  }  // Find maximum element in the path between  // two nodes in BST  static int findMaxElement(Node root int x int y) {  Map<Node Node> parentMap = new HashMap<>();  // Populate parent map with DFS  dfs(root parentMap null);  // Find the nodes corresponding to   // the values x and y  Node p1 = findNode(root x);  Node p2 = findNode(root y);  // If nodes not found  if (p1 == null || p2 == null)  return -1;  // Sets to store nodes encountered   // while traversing up the tree  Set<Node> s1 = new HashSet<>();  Set<Node> s2 = new HashSet<>();  // Variable to store the maximum element   // in the path  int maxElement = Integer.MIN_VALUE;  // Traverse up the tree from p1 and p2   // and add nodes to sets s1 and s2  while (p1 != p2) {  if (p1 != null) {  s1.add(p1);  maxElement = Math.max(maxElement p1.data);  // Move to parent node  p1 = parentMap.get(p1);  }  if (p2 != null) {  s2.add(p2);  maxElement = Math.max(maxElement p2.data);  p2 = parentMap.get(p2);  }  // Check if there's a common node in both sets  if (s1.contains(p2))  break;  if (s2.contains(p1))  break;  }  // Now both p1 and p2 point to their   // Lowest Common Ancestor (LCA)  maxElement = Math.max(maxElement p1.data);  return maxElement;  }  public static void main(String[] args) {  int[] arr = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  int n = arr.length;  Node root = new Node(arr[0]);  for (int i = 1; i < n; i++)  insertNode(root arr[i]);  System.out.println(findMaxElement(root a b));  } } 
Python
# Python program to find maximum element in the path # between two Nodes of Binary Search Tree. class Node: def __init__(self x): self.data = x self.left = None self.right = None # Insert a new Node in Binary Search Tree def insert_node(root x): current = root parent = None # Traverse to the correct position for insertion while current is not None: parent = current if x < current.data: current = current.left else: current = current.right # Insert new Node at the correct position if parent is None: root = Node(x) elif x < parent.data: parent.left = Node(x) else: parent.right = Node(x) # DFS to populate parent map for each node def dfs(root parent_map parent=None): if root is None: return # Store the parent of the current node if parent is not None: parent_map[root] = parent # Recur for left and right children dfs(root.left parent_map root) dfs(root.right parent_map root) # Function to find the node with the given # value in the BST def find_node(root val): if root is None: return None if root.data == val: return root left_result = find_node(root.left val) if left_result: return left_result return find_node(root.right val) # Find maximum element in the path between  # two nodes in BST def find_max_element(root x y): parent_map = {} # Populate parent map with DFS dfs(root parent_map) # Find the nodes corresponding to the  # values x and y p1 = find_node(root x) p2 = find_node(root y) # If nodes not found if not p1 or not p2: return -1 # Sets to store nodes encountered  # while traversing up the tree s1 = set() s2 = set() # Variable to store the maximum element in the path max_element = float('-inf') # Traverse up the tree from p1 and p2  # and add nodes to sets s1 and s2 while p1 != p2: if p1: s1.add(p1) max_element = max(max_element p1.data) # Move to parent node p1 = parent_map.get(p1) if p2: s2.add(p2) max_element = max(max_element p2.data) p2 = parent_map.get(p2) # Check if there's a common node in both sets if p2 in s1: break if p1 in s2: break # Now both p1 and p2 point to their # Lowest Common Ancestor (LCA) max_element = max(max_element p1.data) return max_element if __name__ == '__main__': arr = [18 36 9 6 12 10 1 8] a b = 1 10 n = len(arr) root = Node(arr[0]) for i in range(1 n): insert_node(root arr[i]) print(find_max_element(root a b)) 
C#
// C# program to find the maximum element in the path // between two Nodes of Binary Search Tree. using System; using System.Collections.Generic; class Node {  public int data;  public Node left right;  public Node(int x) {  data = x;  left = right = null;  } } class GfG {    // Insert a new Node in Binary Search Tree  static public void insertNode(Node root int x) {  Node current = root parent = null;  // Traverse to the correct position  // for insertion  while (current != null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct  // position  if (parent == null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x);  }  // DFS to populate parent map for each node  static public void dfs(Node root   Dictionary<Node Node> parentMap Node parent) {  if (root == null)  return;  // Store the parent of the current node  if (parent != null) {  parentMap[root] = parent;  }  // Recur for left and right children  dfs(root.left parentMap root);  dfs(root.right parentMap root);  }  // Function to find the node with the given  // value in the BST  static public Node findNode(Node root int val) {  if (root == null)  return null;  if (root.data == val)  return root;  Node leftResult = findNode(root.left val);  if (leftResult != null)  return leftResult;  return findNode(root.right val);  }  // Find maximum element in the path between   // two nodes in BST  static public int findMaxElement(Node root int x int y) {  Dictionary<Node Node> parentMap = new Dictionary<Node Node>();  // Populate parent map with DFS  dfs(root parentMap null);  // Find the nodes corresponding to   // the values x and y  Node p1 = findNode(root x);  Node p2 = findNode(root y);  // If nodes not found  if (p1 == null || p2 == null)  return -1;  // Sets to store nodes encountered   // while traversing up the tree  HashSet<Node> s1 = new HashSet<Node>();  HashSet<Node> s2 = new HashSet<Node>();  // Variable to store the maximum element   // in the path  int maxElement = int.MinValue;  // Traverse up the tree from p1 and p2   // and add nodes to sets s1 and s2  while (p1 != p2) {  if (p1 != null) {  s1.Add(p1);  maxElement = Math.Max(maxElement p1.data);  // Move to parent node  p1 = parentMap[p1];  }  if (p2 != null) {  s2.Add(p2);  maxElement = Math.Max(maxElement p2.data);  p2 = parentMap[p2];  }  // Check if there's a common node in both sets  if (s1.Contains(p2))  break;  if (s2.Contains(p1))  break;  }  // Now both p1 and p2 point to their Lowest   // Common Ancestor (LCA)  maxElement = Math.Max(maxElement p1.data);  return maxElement;  }  static void Main() {  int[] arr = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  int n = arr.Length;  Node root = new Node(arr[0]);  for (int i = 1; i < n; i++)  insertNode(root arr[i]);  Console.WriteLine(findMaxElement(root a b));  } } 
JavaScript
// JavaScript program to find the maximum element in the path // between two Nodes of Binary Search Tree. class Node {  constructor(x) {  this.data = x;  this.left = this.right = null;  } } // Insert a new Node in Binary Search Tree function insertNode(root x) {  let current = root parent = null;  // Traverse to the correct position for insertion  while (current !== null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct position  if (parent === null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x); } // DFS to populate parent map for each node function dfs(root parentMap parent = null) {  if (root === null) return;  // Store the parent of the current node  if (parent !== null) {  parentMap.set(root parent);  }  // Recur for left and right children  dfs(root.left parentMap root);  dfs(root.right parentMap root); } // Function to find the node with the given  // value in the BST function findNode(root val) {  if (root === null) return null;  if (root.data === val)  return root;  let leftResult = findNode(root.left val);  if (leftResult !== null)  return leftResult;  return findNode(root.right val); } // Find maximum element in the path // between two nodes in BST function findMaxElement(root x y) {  let parentMap = new Map();  // Populate parent map with DFS  dfs(root parentMap);  // Find the nodes corresponding to the  // values x and y  let p1 = findNode(root x);  let p2 = findNode(root y);  // If nodes not found  if (p1 === null || p2 === null)  return -1;  // Sets to store nodes encountered  let s1 = new Set();  let s2 = new Set();  // Variable to store the maximum   // element in the path  let maxElement = -Infinity;  // Traverse up the tree from p1 and p2   // and add nodes to sets s1 and s2  while (p1 !== p2) {  if (p1 !== null) {  s1.add(p1);  maxElement = Math.max(maxElement p1.data);  // Move to parent node  p1 = parentMap.get(p1);  }  if (p2 !== null) {  s2.add(p2);  maxElement = Math.max(maxElement p2.data);  p2 = parentMap.get(p2);  }  // Check if there's a common node in both sets  if (s1.has(p2)) break;  if (s2.has(p1)) break;  }  // Now both p1 and p2 point to their Lowest   // Common Ancestor (LCA)  maxElement = Math.max(maxElement p1.data);  return maxElement; } let arr = [18 36 9 6 12 10 1 8]; let a = 1 b = 10; let n = arr.length; let root = new Node(arr[0]); for (let i = 1; i < n; i++)  insertNode(root arr[i]); console.log(findMaxElement(root a b)); 

Çıkış
12 

[Beklenen yaklaşım] İki düğümün LCA'sını kullanma - O(h) Zaman ve O(h) Uzay

Fikir bulmaktır En Düşük Ortak Ata 'a' düğümü ve 'b' düğümü. Daha sonra LCA ile 'a' arasındaki maksimum düğümü arayın ve ayrıca LCA ile 'b' arasındaki maksimum düğümü bulun. Cevap maksimum iki düğüm olacaktır.

Yukarıdaki algoritmanın uygulaması aşağıdadır:

C++
// C++ program to find maximum element in the path // between two Nodes of Binary Search Tree. #include    using namespace std; class Node {  public:  Node *left *right;  int data;  Node(int x) {  data = x;  left = right = nullptr;  } }; // Insert a new Node in Binary Search Tree. void insertNode(struct Node *root int x) {  Node *current = root *parent = nullptr;  while (current != nullptr) {  parent = current;  if (current->data < x)  current = current->right;  else  current = current->left;  }  if (parent == nullptr)  current = new Node(x);  else {  if (parent->data < x)  parent->right = new Node(x);  else  parent->left = new Node(x);  } } // Return the maximum element between a Node // and its given ancestor. int maxelpath(Node *root int x) {  Node *current = root;  int mx = INT_MIN;  // Traversing the path between ancestor and  // Node and finding maximum element.  while (current->data != x) {  if (current->data > x) {  mx = max(mx current->data);  current = current->left;  }  else {  mx = max(mx current->data);  current = current->right;  }  }  return max(mx x); } // Return maximum element in the path between // two given Node of BST. int maximumElement(Node *root int x int y) {  Node *current = root;  // Finding the LCA of Node x and Node y  while ((x < current->data && y < current->data)   || (x > current->data && y > current->data)) {  // Checking if both the Node lie on the  // left side of the parent p.  if (x < current->data && y < current->data)  current = current->left;  // Checking if both the Node lie on the  // right side of the parent p.  else if (x > current->data && y > current->data)  current = current->right;  }  // Return the maximum of maximum elements occur  // in path from ancestor to both Node.  return max(maxelpath(current x) maxelpath(current y)); } int main() {  int arr[] = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  int n = sizeof(arr) / sizeof(arr[0]);  Node *root = new Node(arr[0]);  for (int i = 1; i < n; i++)  insertNode(root arr[i]);  cout << maximumElement(root a b) << endl;  return 0; } 
Java
// Java program to find maximum element in the path // between two Nodes of Binary Search Tree. import java.util.*; class Node {  int data;  Node left right;  Node(int x) {  data = x;  left = right = null;  } } class GfG {    // Insert a new Node in Binary Search Tree  static void insertNode(Node root int x) {  Node current = root parent = null;  // Traverse to the correct   // position for insertion  while (current != null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct   // position  if (parent == null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x);  }  // Find maximum element in the path from   // an ancestor to a node  static int maxInPath(Node root int x) {  int maxElement = Integer.MIN_VALUE;  Node current = root;  // Traverse the path from root to the   // target node 'x'  while (current != null && current.data != x) {  maxElement = Math.max(maxElement current.data);  if (x < current.data)  current = current.left;  else  current = current.right;  }  return Math.max(maxElement x);   }  // Find maximum element in the path between two  // nodes in BST  static int findMaxElement(Node root int x int y) {  Node current = root;  // Find Lowest Common Ancestor (LCA) of x and y  while ((x < current.data && y < current.data)   || (x > current.data && y > current.data)) {  if (x < current.data && y < current.data)  current = current.left;  else if (x > current.data && y > current.data)  current = current.right;  }  // Find maximum elements in paths from LCA   // to x and LCA to y  return Math.max(maxInPath(current x) maxInPath(current y));  }  public static void main(String[] args) {  int[] arr = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  Node root = new Node(arr[0]);  for (int i = 1; i < arr.length; i++)  insertNode(root arr[i]);    System.out.println(findMaxElement(root a b));  } } 
Python
# Python program to find maximum element in the path # between two Nodes of Binary Search Tree. class Node: def __init__(self x): self.data = x self.left = None self.right = None # Insert a new Node in Binary Search Tree def insertNode(root x): current = root parent = None # Traverse to the correct position for insertion while current is not None: parent = current if x < current.data: current = current.left else: current = current.right # Insert new Node at the correct position if parent is None: root = Node(x) elif x < parent.data: parent.left = Node(x) else: parent.right = Node(x) # Find maximum element in the path from an # ancestor to a node def maxInPath(root x): maxElement = float('-inf') current = root # Traverse the path from root to the # target node 'x' while current is not None and current.data != x: maxElement = max(maxElement current.data) if x < current.data: current = current.left else: current = current.right return max(maxElement x) # Find maximum element in the path between # two nodes in BST def findMaxElement(root x y): current = root # Find Lowest Common Ancestor (LCA) of x and y while (x < current.data and y < current.data)  or (x > current.data and y > current.data): if x < current.data and y < current.data: current = current.left elif x > current.data and y > current.data: current = current.right # Find maximum elements in paths from LCA to # x and LCA to y return max(maxInPath(current x) maxInPath(current y)) if __name__ == '__main__': arr = [18 36 9 6 12 10 1 8] a b = 1 10 root = Node(arr[0]) for i in range(1 len(arr)): insertNode(root arr[i]) print(findMaxElement(root a b)) 
C#
// C# program to find maximum element in the path // between two Nodes of Binary Search Tree. using System; class Node {  public int data;  public Node left right;  public Node(int x) {  data = x;  left = right = null;  } } class GfG {    // Insert a new Node in Binary Search Tree  static void insertNode(Node root int x) {  Node current = root parent = null;  // Traverse to the correct position  // for insertion  while (current != null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct position  if (parent == null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x);  }  // Find maximum element in the path from an   // ancestor to a node  static int maxInPath(Node root int x) {  int maxElement = int.MinValue;  Node current = root;  // Traverse the path from root to the target node 'x'  while (current != null && current.data != x) {  maxElement = Math.Max(maxElement current.data);  if (x < current.data)  current = current.left;  else  current = current.right;  }  return Math.Max(maxElement x);  }  // Find maximum element in the path between two nodes in BST  static int findMaxElement(Node root int x int y) {  Node current = root;  // Find Lowest Common Ancestor (LCA) of x and y  while ((x < current.data && y < current.data)   || (x > current.data && y > current.data)) {  if (x < current.data && y < current.data)  current = current.left;  else if (x > current.data && y > current.data)  current = current.right;  }  // Find maximum elements in paths from  // LCA to x and LCA to y  return Math.Max(maxInPath(current x) maxInPath(current y));  }  static void Main() {  int[] arr = {18 36 9 6 12 10 1 8};  int a = 1 b = 10;  Node root = new Node(arr[0]);    for (int i = 1; i < arr.Length; i++)  insertNode(root arr[i]);  Console.WriteLine(findMaxElement(root a b));  } } 
JavaScript
// JavaScript program to find maximum element in the path // between two Nodes of Binary Search Tree. class Node {  constructor(x) {  this.data = x;  this.left = null;  this.right = null;  } } // Insert a new Node in Binary Search Tree function insertNode(root x) {  let current = root parent = null;  // Traverse to the correct position for insertion  while (current !== null) {  parent = current;  if (x < current.data)  current = current.left;  else  current = current.right;  }  // Insert new Node at the correct position  if (parent === null)  root = new Node(x);  else if (x < parent.data)  parent.left = new Node(x);  else  parent.right = new Node(x); } // Find maximum element in the path from an  // ancestor to a node function maxInPath(root x) {  let maxElement = -Infinity;  let current = root;  // Traverse the path from root to the target node 'x'  while (current !== null && current.data !== x) {  maxElement = Math.max(maxElement current.data);  if (x < current.data)  current = current.left;  else  current = current.right;  }  return Math.max(maxElement x); } // Find maximum element in the path between // two nodes in BST function findMaxElement(root x y) {  let current = root;  // Find Lowest Common Ancestor (LCA) of x and y  while ((x < current.data && y < current.data)   || (x > current.data && y > current.data)) {  if (x < current.data && y < current.data)  current = current.left;  else if (x > current.data && y > current.data)  current = current.right;  }  // Find maximum elements in paths from LCA to   // x and LCA to y  return Math.max(maxInPath(current x) maxInPath(current y)); } const arr = [18 36 9 6 12 10 1 8]; const a = 1 b = 10; const root = new Node(arr[0]); for (let i = 1; i < arr.length; i++) {  insertNode(root arr[i]); } console.log(findMaxElement(root a b)); 

Çıkış
12 
Test Oluştur