Найдите k-й узел в вертикальном обходе двоичного дерева
Опубликовано: 23 Января, 2022
Для двоичного дерева и целого числа k задача состоит в том, чтобы вывести k-й узел в вертикальном обходе двоичного дерева. Если такой узел не существует, выведите -1 .
Обход двоичного дерева в вертикальном порядке означает его распечатку вертикально.
Примеры:
Вход: 1 / 2 3 / / 4 5 6 7 8 9 k = 3 Выход: 1 Вертикальный обход дерева выше: 4 2 1 5 6 3 8 7 9 Вход: 1 / 2 3 / / 4 5 6 7 8 9 k = 13 Выход: -1
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Подход: идея состоит в том, чтобы выполнить обход вертикального порядка и проверить, является ли текущий узел k-м узлом, а затем вывести его значение, если количество узлов в дереве меньше K, тогда выведите -1.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Structure for a binary tree node struct Node { int key; Node *left, *right; }; // A utility function to create a new node Node* newNode( int key) { Node* node = new Node; node->key = key; node->left = node->right = NULL; return node; } // Function to find kth node // in vertcial order traversal int KNodeVerticalOrder(Node* root, int k) { // Base case if (!root || k == 0) return -1; int n = 0; // Variable to store kth node int k_node = -1; // Create a map and store vertical order in // map map< int , vector< int > > m; int hd = 0; // Create queue to do level order traversal // Every item of queue contains node and // horizontal distance queue<pair<Node*, int > > que; que.push(make_pair(root, hd)); while (!que.empty()) { // Pop from queue front pair<Node*, int > temp = que.front(); que.pop(); hd = temp.second; Node* node = temp.first; // Insert this node"s data in vector of hash m[hd].push_back(node->key); if (node->left != NULL) que.push(make_pair(node->left, hd - 1)); if (node->right != NULL) que.push(make_pair(node->right, hd + 1)); } // Traverse the map and find kth // node map< int , vector< int > >::iterator it; for (it = m.begin(); it != m.end(); it++) { for ( int i = 0; i < it->second.size(); ++i) { n++; if (n == k) return (it->second[i]); } } if (k_node == -1) return -1; } // Driver code int main() { Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->left = newNode(6); root->right->right = newNode(7); root->right->left->right = newNode(8); root->right->right->right = newNode(9); root->right->right->left = newNode(10); root->right->right->left->right = newNode(11); root->right->right->left->right->right = newNode(12); int k = 5; cout << KNodeVerticalOrder(root, k); return 0; } |
Java
// Java implementation of the approach import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import java.util.SortedMap; import java.util.TreeMap; class GFG{ // Structure for a binary tree node static class Node { int key; Node left, right; public Node( int key) { this .key = key; this .left = this .right = null ; } }; static class Pair { Node first; int second; public Pair(Node first, int second) { this .first = first; this .second = second; } } // Function to find kth node // in vertcial order traversal static int KNodeVerticalOrder(Node root, int k) { // Base case if (root == null || k == 0 ) return - 1 ; int n = 0 ; // Variable to store kth node int k_node = - 1 ; // Create a map and store vertical order in // map SortedMap<Integer, ArrayList<Integer>> m = new TreeMap<Integer, ArrayList<Integer>>(); int hd = 0 ; // Create queue to do level order traversal // Every item of queue contains node and // horizontal distance Queue<Pair> que = new LinkedList<>(); que.add( new Pair(root, hd)); while (!que.isEmpty()) { // Pop from queue front Pair temp = que.poll(); hd = temp.second; Node node = temp.first; // Insert this node"s data in // vector of hash if (m.get(hd) == null ) m.put(hd, new ArrayList<>()); m.get(hd).add(node.key); if (node.left != null ) que.add( new Pair(node.left, hd - 1 )); if (node.right != null ) que.add( new Pair(node.right, hd + 1 )); } // Traverse the map and find kth // node for (Map.Entry<Integer, ArrayList<Integer>> it : m.entrySet()) { for ( int i = 0 ; i < it.getValue().size(); i++) { n++; if (n == k) { return it.getValue().get(i); } } } if (k_node == - 1 ) return - 1 ; return 0 ; } // Driver code public static void main(String[] args) { Node root = new Node( 1 ); root.left = new Node( 2 ); root.right = new Node( 3 ); root.left.left = new Node( 4 ); root.left.right = new Node( 5 ); root.right.left = new Node( 6 ); root.right.right = new Node( 7 ); root.right.left.right = new Node( 8 ); root.right.right.right = new Node( 9 ); root.right.right.left = new Node( 10 ); root.right.right.left.right = new Node( 11 ); root.right.right.left.right.right = new Node( 12 ); int k = 5 ; System.out.println(KNodeVerticalOrder(root, k)); } } // This code is contributed by sanjeev2552 |
Python3
# Python3 implementation of the approach # Tree node structure class Node: def __init__( self , key): self .key = key self .left = None self .right = None # Function to find kth node # in vertcial order traversal def KNodeVerticalOrder(root, k): # Base case if not root or k = = 0 : return - 1 n = 0 # Variable to store kth node k_node = - 1 # Create a map and store # vertical order in map m = {} hd = 0 # Create queue to do level order # traversal Every item of queue contains # node and horizontal distance que = [] que.append((root, hd)) while len (que) > 0 : # Pop from queue front temp = que.pop( 0 ) hd = temp[ 1 ] node = temp[ 0 ] # Insert this node"s data in vector of hash if hd not in m: m[hd] = [] m[hd].append(node.key) if node.left ! = None : que.append((node.left, hd - 1 )) if node.right ! = None : que.append((node.right, hd + 1 )) # Traverse the map and find kth node for it in sorted (m): for i in range ( 0 , len (m[it])): n + = 1 if n = = k: return m[it][i] if k_node = = - 1 : return - 1 # Driver code if __name__ = = "__main__" : root = Node( 1 ) root.left = Node( 2 ) root.right = Node( 3 ) root.left.left = Node( 4 ) root.left.right = Node( 5 ) root.right.left = Node( 6 ) root.right.right = Node( 7 ) root.right.left.right = Node( 8 ) root.right.right.right = Node( 9 ) root.right.right.left = Node( 10 ) root.right.right.left.right = Node( 11 ) root.right.right.left.right.right = Node( 12 ) k = 5 print (KNodeVerticalOrder(root, k)) # This code is contributed by Rituraj Jain |
C#
// C# implementation of the approach using System.Collections.Generic; using System.Collections; using System; class GFG{ // Structure for a // binary tree node class Node { public int key; public Node left, right; public Node( int key) { this .key = key; this .left = this .right = null ; } }; class Pair { public Node first; public int second; public Pair(Node first, int second) { this .first = first; this .second = second; } } // Function to find kth node // in vertcial order traversal static int KNodeVerticalOrder(Node root, int k) { // Base case if (root == null || k == 0) return -1; int n = 0; // Variable to store // kth node int k_node = -1; // Create a map and store // vertical order in map SortedDictionary< int , ArrayList> m = new SortedDictionary< int , ArrayList>(); int hd = 0; // Create queue to do level order // traversal. Every item of queue // contains node and horizontal // distance Queue que = new Queue(); que.Enqueue( new KeyValuePair<Node, int >(root, hd)); while (que.Count != 0) { // Pop from queue front KeyValuePair<Node, int > temp = (KeyValuePair<Node, int >)que.Dequeue(); hd = temp.Value; Node node = temp.Key; // Insert this node"s data in // vector of hash if (!m.ContainsKey(hd)) РЕКОМЕНДУЕМЫЕ СТАТЬИ |