Trova la profondità o l'altezza massima di un determinato albero binario

Trova la profondità o l'altezza massima di un determinato albero binario

Dato un albero binario, il compito è trovare l'altezza dell'albero. L'altezza dell'albero è il numero di vertici dell'albero dalla radice al nodo più profondo.

Nota: L'altezza di un albero vuoto è 0 e l'altezza di un albero con nodo singolo è 1 .

Esempio di albero binario

Esempio di albero binario

Altezza pratica consigliata dell'albero binario Provalo!

Calcolare ricorsivamente l'altezza di Sinistra e il Giusto sottoalberi di un nodo e assegnare l'altezza al nodo come altezza massima di due bambini più 1 . Vedi sotto lo pseudo codice e il programma per i dettagli.

Illustrazione:

Consideriamo il seguente albero:

Esempio di albero

Esempio di albero

maxProfondità('1') = max(maxProfondità('2'), maxProfondità('3')) + 1 = 2 + 1

perché ricorsivamente
maxDepth('2') = max (maxDepth('4'), maxDepth('5')) + 1 = 1 + 1 e (poiché l'altezza di '4' e '5' è 1)
profonditàmax('3') = 1

Segui i passaggi seguenti per implementare l'idea:

  • Esegui ricorsivamente una ricerca approfondita.
  • Se l'albero è vuoto restituisce 0
  • Altrimenti, procedi come segue
    • Ottieni ricorsivamente la profondità massima del sottoalbero sinistro, ovvero chiama maxDepth( tree->left-subtree)
    • Ottieni ricorsivamente la profondità massima del sottoalbero destro, ovvero chiama maxDepth( tree->right-subtree)
    • Ottieni il massimo della profondità massima di Sinistra E Giusto sottoalberi e aggiungi 1 ad esso per il nodo corrente.
      • max_profondità = max(profondità massima del sottoalbero sinistro, profondità massima del sottoalbero destro) + 1
  • Restituisce profondità_massima.

Di seguito è riportata l’implementazione dell’approccio di cui sopra:

C++

// C++ program to find height of tree> #include> using> namespace> std;> /* A binary tree node has data, pointer to left child> and a pointer to right child */> class> node {> public> :> > int> data;> > node* left;> > node* right;> };> /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> int> maxDepth(node* node)> {> > if> (node == NULL)> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node->sinistra);> > int> rDepth = maxDepth(node->destra);> > /* use the larger one */> > if> (lDepth>rProfondità)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> }> /* Helper function that allocates a new node with the> given data and NULL left and right pointers. */> node* newNode(> int> data)> {> > node* Node => new> node();> > Node->dati = dati;> > Node->sinistra = NULL;> > Node->destra = NULL;> > return> (Node);> }> // Driver code> int> main()> {> > node* root = newNode(1);> > root->sinistra = nuovoNodo(2);> > root->destra = nuovoNodo(3);> > root->sinistra->sinistra = nuovoNodo(4);> > root->sinistra->destra = nuovoNodo(5);> > cout < <> 'Height of tree is '> < < maxDepth(root);> > return> 0;> }> // This code is contributed by Amit Srivastav>

C

#include> #include> /* A binary tree node has data, pointer to left child> > and a pointer to right child */> struct> node {> > int> data;> > struct> node* left;> > struct> node* right;> };> /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> int> maxDepth(> struct> node* node)> {> > if> (node == NULL)> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node->sinistra);> > int> rDepth = maxDepth(node->destra);> > /* use the larger one */> > if> (lDepth>rProfondità)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> }> /* Helper function that allocates a new node with the> > given data and NULL left and right pointers. */> struct> node* newNode(> int> data)> {> > struct> node* node> > = (> struct> node*)> malloc> (> sizeof> (> struct> node));> > node->dati = dati;> > node->sinistra = NULL;> > node->destra = NULL;> > return> (node);> }> int> main()> {> > struct> node* root = newNode(1);> > root->sinistra = nuovoNodo(2);> > root->destra = nuovoNodo(3);> > root->sinistra->sinistra = nuovoNodo(4);> > root->sinistra->destra = nuovoNodo(5);> > printf> (> 'Height of tree is %d'> , maxDepth(root));> > getchar> ();> > return> 0;> }>

Giava

// Java program to find height of tree> // A binary tree node> class> Node {> > int> data;> > Node left, right;> > Node(> int> item)> > {> > data = item;> > left = right => null> ;> > }> }> class> BinaryTree {> > Node root;> > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > int> maxDepth(Node node)> > {> > if> (node ==> null> )> > return> 0> ;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node.left);> > int> rDepth = maxDepth(node.right);> > /* use the larger one */> > if> (lDepth>rProfondità)> > return> (lDepth +> 1> );> > else> > return> (rDepth +> 1> );> > }> > }> > /* Driver program to test above functions */> > public> static> void> main(String[] args)> > {> > BinaryTree tree => new> BinaryTree();> > tree.root => new> Node(> 1> );> > tree.root.left => new> Node(> 2> );> > tree.root.right => new> Node(> 3> );> > tree.root.left.left => new> Node(> 4> );> > tree.root.left.right => new> Node(> 5> );> > System.out.println(> 'Height of tree is '> > + tree.maxDepth(tree.root));> > }> }> // This code has been contributed by Amit Srivastav>

Python3

# Python3 program to find the maximum depth of tree> # A binary tree node> class> Node:> > # Constructor to create a new node> > def> __init__(> self> , data):> > self> .data> => data> > self> .left> => None> > self> .right> => None> # Compute the 'maxDepth' of a tree -- the number of nodes> # along the longest path from the root node down to the> # farthest leaf node> def> maxDepth(node):> > if> node> is> None> :> > return> 0> > else> :> > # Compute the depth of each subtree> > lDepth> => maxDepth(node.left)> > rDepth> => maxDepth(node.right)> > # Use the larger one> > if> (lDepth>rProfondità):> > return> lDepth> +> 1> > else> :> > return> rDepth> +> 1> # Driver program to test above function> root> => Node(> 1> )> root.left> => Node(> 2> )> root.right> => Node(> 3> )> root.left.left> => Node(> 4> )> root.left.right> => Node(> 5> )> print> (> 'Height of tree is %d'> %> (maxDepth(root)))> # This code is contributed by Amit Srivastav>

C#

// C# program to find height of tree> using> System;> // A binary tree node> public> class> Node {> > public> int> data;> > public> Node left, right;> > public> Node(> int> item)> > {> > data = item;> > left = right => null> ;> > }> }> public> class> BinaryTree {> > Node root;> > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > int> maxDepth(Node node)> > {> > if> (node ==> null> )> > return> 0;> > else> {> > /* compute the depth of each subtree */> > int> lDepth = maxDepth(node.left);> > int> rDepth = maxDepth(node.right);> > /* use the larger one */> > if> (lDepth>rProfondità)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> > }> > /* Driver code */> > public> static> void> Main(String[] args)> > {> > BinaryTree tree => new> BinaryTree();> > tree.root => new> Node(1);> > tree.root.left => new> Node(2);> > tree.root.right => new> Node(3);> > tree.root.left.left => new> Node(4);> > tree.root.left.right => new> Node(5);> > Console.WriteLine(> 'Height of tree is '> > + tree.maxDepth(tree.root));> > }> }> // This code has been contributed by> // Correction done by Amit Srivastav>

Javascript

> // JavaScript program to find height of tree> // A binary tree node> class Node> {> > constructor(item)> > {> > this> .data=item;> > this> .left=> this> .right=> null> ;> > }> }> > let root;> > > /* Compute the 'maxDepth' of a tree -- the number of> > nodes along the longest path from the root node> > down to the farthest leaf node.*/> > function> maxDepth(node)> > {> > if> (node ==> null> )> > return> 0;> > else> > {> > /* compute the depth of each subtree */> > let lDepth = maxDepth(node.left);> > let rDepth = maxDepth(node.right);> > > /* use the larger one */> > if> (lDepth>rProfondità)> > return> (lDepth + 1);> > else> > return> (rDepth + 1);> > }> > }> > > /* Driver program to test above functions */> > > 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);> > > document.write(> 'Height of tree is : '> +> > maxDepth(root));> // This code is contributed by rag2127> //Correction done by Amit Srivastav> >

Produzione
Height of tree is 3 

Complessità temporale: O(N) (Vedi il post su Attraversamento degli alberi per dettagli)
Spazio ausiliario: O(N) a causa dello stack ricorsivo.

Trova la profondità o l'altezza massima di un albero utilizzando Attraversamento dell'ordine di livello :

Fare Attraversamento dell'ordine di livello , aggiungendo nodi ad ogni livello a Segui i passaggi seguenti per implementare l'idea:

  • Attraversare l'albero in ordine di livello partendo da radice .
    • Inizializza una coda vuota Q , una variabile profondità e spingere radice , quindi spingere nullo dentro Q .
    • Esegui un ciclo while fino a Q non è vuoto.
      • Conservare l'elemento anteriore di Q ed estrarre l'elemento anteriore.
      • Se la parte anteriore di Q È NULLO quindi incrementare profondità per uno e se la coda non è vuota, premere NULLO dentro Q .
      • Altrimenti se l'elemento non lo è NULLO quindi controllalo Sinistra E Giusto bambini e se non lo sono NULLO spingerli dentro Q .
  • Ritorno profondità .

Di seguito è riportata l’implementazione dell’approccio di cui sopra:

C++

#include> #include> using> namespace> std;> // A Tree node> struct> Node {> > int> key;> > struct> Node *left, *right;> };> // Utility function to create a new node> Node* newNode(> int> key)> {> > Node* temp => new> Node;> > temp->chiave = chiave;> > temp->sinistra = temp->destra = NULL;> > return> (temp);> }> /*Function to find the height(depth) of the tree*/> int> height(> struct> Node* root)> {> > // Initialising a variable to count the> > // height of tree> > int> depth = 0;> > queue q;> > // Pushing first level element along with NULL> > q.push(root);> > q.push(NULL);> > while> (!q.empty()) {> > Node* temp = q.front();> > q.pop();> > // When NULL encountered, increment the value> > if> (temp == NULL) {> > depth++;> > }> > // If NULL not encountered, keep moving> > if> (temp != NULL) {> > if> (temp->sinistra) {> > q.push(temp->sinistra);> > }> > if> (temp->destra) {> > q.push(temp->destra);> > }> > }> > // If queue still have elements left,> > // push NULL again to the queue.> > else> if> (!q.empty()) {> > q.push(NULL);> > }> > }> > return> depth;> }> // Driver program> int> main()> {> > // Let us create Binary Tree shown in above example> > Node* root = newNode(1);> > root->sinistra = nuovoNodo(2);> > root->destra = nuovoNodo(3);> > root->sinistra->sinistra = nuovoNodo(4);> > root->sinistra->destra = nuovoNodo(5);> > cout < <> 'Height(Depth) of tree is: '> < < height(root);> }>

Giava

// Java program for above approach> import> java.util.LinkedList;> import> java.util.Queue;> class> GFG {> > // A tree node structure> > static> class> Node {> > int> key;> > Node left;> > Node right;> > }> > // Utility function to create> > // a new node> > static> Node newNode(> int> key)> > {> > Node temp => new> Node();> > temp.key = key;> > temp.left = temp.right => null> ;> > return> temp;> > }> > /*Function to find the height(depth) of the tree*/> > public> static> int> height(Node root)> > {> > // Initialising a variable to count the> > // height of tree> > int> depth => 0> ;> > Queue q => new> LinkedList();> > // Pushing first level element along with null> > q.add(root);> > q.add(> null> );> > while> (!q.isEmpty()) {> > Node temp = q.peek();> > q.remove();> > // When null encountered, increment the value> > if> (temp ==> null> ) {> > depth++;> > }> > // If null not encountered, keep moving> > if> (temp !=> null> ) {> > if> (temp.left !=> null> ) {> > q.add(temp.left);> > }> > if> (temp.right !=> null> ) {> > q.add(temp.right);> > }> > }> > // If queue still have elements left,> > // push null again to the queue.> > else> if> (!q.isEmpty()) {> > q.add(> null> );> > }> > }> > return> depth;> > }> > // Driver Code> > public> static> void> main(String args[])> > {> > Node root = newNode(> 1> );> > root.left = newNode(> 2> );> > root.right = newNode(> 3> );> > root.left.left = newNode(> 4> );> > root.left.right = newNode(> 5> );> > System.out.println(> 'Height(Depth) of tree is: '> > + height(root));> > }> }> // This code is contributed by jana_sayantan.>

Python3

# Python code to implement the approach> # A Tree node> class> Node:> > def> __init__(> self> ):> > self> .key> => 0> > self> .left,> self> .right> => None> ,> None> # Utility function to create a new node> def> newNode(key):> > temp> => Node()> > temp.key> => key> > temp.left, temp.right> => None> ,> None> > return> temp> # Function to find the height(depth) of the tree> def> height(root):> > # Initialising a variable to count the> > # height of tree> > depth> => 0> > q> => []> > # appending first level element along with None> > q.append(root)> > q.append(> None> )> > while> (> len> (q)>> 0> ):> > temp> => q[> 0> ]> > q> => q[> 1> :]> > # When None encountered, increment the value> > if> (temp> => => None> ):> > depth> +> => 1> > # If None not encountered, keep moving> > if> (temp !> => None> ):> > if> (temp.left):> > q.append(temp.left)> > if> (temp.right):> > q.append(temp.right)> > # If queue still have elements left,> > # append None again to the queue.> > elif> (> len> (q)>> 0> ):> > q.append(> None> )> > return> depth> # Driver program> # Let us create Binary Tree shown in above example> root> => newNode(> 1> )> root.left> => newNode(> 2> )> root.right> => newNode(> 3> )> root.left.left> => newNode(> 4> )> root.left.right> => newNode(> 5> )> print> (f> 'Height(Depth) of tree is: {height(root)}'> )> # This code is contributed by shinjanpatra>

C#

// C# Program to find the Maximum Depth or Height of Binary Tree> using> System;> using> System.Collections.Generic;> // A Tree node> public> class> Node {> > public> int> data;> > public> Node left, right;> > public> Node(> int> item)> > {> > data = item;> > left => null> ;> > right => null> ;> > }> }> public> class> BinaryTree {> > Node root;> > // Function to find the height(depth) of the tree> > int> height()> > {> > // Initialising a variable to count the> > // height of tree> > int> depth = 0;> > Queue q => new> Queue();> > // Pushing first level element along with NULL> > q.Enqueue(root);> > q.Enqueue(> null> );> > while> (q.Count != 0) {> > Node temp = q.Dequeue();> > // When NULL encountered, increment the value> > if> (temp ==> null> )> > depth++;> > // If NULL not encountered, keep moving> > if> (temp !=> null> ) {> > if> (temp.left !=> null> ) {> > q.Enqueue(temp.left);> > }> > if> (temp.right !=> null> ) {> > q.Enqueue(temp.right);> > }> > }> > // If queue still have elements left,> > // push NULL again to the queue> > else> if> (q.Count != 0) {> > q.Enqueue(> null> );> > }> > }> > return> depth;> > }> > // Driver program> > public> static> void> Main()> > {> > // Let us create Binary Tree shown in above example> > BinaryTree tree => new> BinaryTree();> > tree.root => new> Node(1);> > tree.root.left => new> Node(2);> > tree.root.right => new> Node(3);> > tree.root.left.left => new> Node(4);> > tree.root.left.right => new> Node(5);> > Console.WriteLine(> 'Height(Depth) of tree is: '> > + tree.height());> > }> }> // This code is contributed by Yash Agarwal(yashagarwal2852002)>

Javascript

> // JavaScript code to implement the approach> // A Tree node> class Node{> > constructor(){> > this> .key = 0> > this> .left => null> > this> .right => null> > }> }> // Utility function to create a new node> function> newNode(key){> > let temp => new> Node()> > temp.key = key> > temp.left => null> > temp.right => null> > return> temp> }> // Function to find the height(depth) of the tree> function> height(root){> > // Initialising a variable to count the> > // height of tree> > let depth = 0> > let q = []> > > // pushing first level element along with null> > q.push(root)> > q.push(> null> )> > while> (q.length>0){> > let temp = q.shift()> > > // When null encountered, increment the value> > if> (temp ==> null> )> > depth += 1> > > // If null not encountered, keep moving> > if> (temp !=> null> ){> > if> (temp.left)> > q.push(temp.left)> > > if> (temp.right)> > q.push(temp.right)> > }> > > // If queue still have elements left,> > // push null again to the queue.> > else> if> (q.length>0)> > q.push(> null> )> > }> > return> depth> }> // Driver program> // Let us create Binary Tree shown in above example> let root = newNode(1)> root.left = newNode(2)> root.right = newNode(3)> root.left.left = newNode(4)> root.left.right = newNode(5)> document.write(`Height(Depth) of tree is: ${height(root)}`,> ''> )> // This code is contributed by shinjanpatra> >

Produzione
Height(Depth) of tree is: 3 

Complessità temporale: SU)
Spazio ausiliario: SU)

Un altro metodo per trovare l'altezza utilizzando Attraversamento dell'ordine di livello :

Anche questo metodo utilizza il concetto di Level Order Traversal ma non aggiungeremo null nella coda. Aumenta semplicemente il contatore quando il livello aumenta e spinge i figli del nodo corrente nella coda, quindi rimuove tutti i nodi dalla coda del livello corrente.

C++

// C++ program for above approach> #include> using> namespace> std;> // A Tree node> struct> Node {> > int> key;> > struct> Node *left, *right;> };> // Utility function to create a new node> Node* newNode(> int> key)> {> > Node* temp => new> Node;> > temp->chiave = chiave;> > temp->sinistra = temp->destra = NULL;> > return> (temp);> }> /*Function to find the height(depth) of the tree*/> int> height(Node* root)> {> > // Initialising a variable to count the> > // height of tree> > queue q;> > q.push(root);> > int> height = 0;> > while> (!q.empty()) {> > int> size = q.size();> > for> (> int> i = 0; i Node* temp = q.front(); q.pop(); if (temp->sinistra!= NULL) { q.push(temp->sinistra); } if (temp->right != NULL) { q.push(temp->right); } } altezza++; } restituisce l'altezza; } // Programma driver int main() { // Creiamo l'albero binario mostrato nell'esempio sopra Node* root = newNode(1); radice->sinistra = nuovoNodo(2); radice->destra = nuovoNodo(3); radice->sinistra->sinistra = nuovoNodo(4); radice->sinistra->destra = nuovoNodo(5); cout < < 'Height(Depth) of tree is: ' < < height(root); } // This code is contributed by Abhijeet Kumar(abhijeet19403)>

Giava

// Java program for above approach> import> java.util.LinkedList;> import> java.util.Queue;> class> GFG {> > // A tree node structure> > static> class> Node {> > int> key;> > Node left;> > Node right;> > }> > // Utility function to create> > // a new node> > static> Node newNode(> int> key)> > {> > Node temp => new> Node();> > temp.key = key;> > temp.left = temp.right => null> ;> > return> temp;> > }> > /*Function to find the height(depth) of the tree*/> > public> static> int> height(Node root)> > {> > // Initialising a variable to count the> > // height of tree> > Queue q => new> LinkedList();> > q.add(root);> > int> height => 0> ;> > while> (!q.isEmpty()) {> > int> size = q.size();> > for> (> int> i => 0> ; i Node temp = q.poll(); if (temp.left != null) { q.add(temp.left); } if (temp.right != null) { q.add(temp.right); } } height++; } return height; } // Driver Code public static void main(String args[]) { Node root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); System.out.println('Height(Depth) of tree is: ' + height(root)); } }>

Python3

# Python3 program to find the height of a tree> > # A binary tree node> class> Node:> > > # Constructor to create a new node> > def> __init__(> self> , data):> > self> .key> => data> > self> .left> => None> > self> .right> => None> > # Function to find height of tree> def> height(root):> > # Base Case> > if> root> is> None> :> > return> 0> > > # Create an empty queue for level order traversal> > q> => []> > > # Enqueue Root and initialize height> > q.append(root)> > height> => 0> > > # Loop while queue is not empty> > while> q:> > > # nodeCount (queue size) indicates number of nodes> > # at current level> > nodeCount> => len> (q)> > > # Dequeue all nodes of current level and Enqueue all> > # nodes of next level> > while> nodeCount>> 0> :> > node> => q.pop(> 0> )> > if> node.left> is> not> None> :> > q.append(node.left)> > if> node.right> is> not> None> :> > q.append(node.right)> > nodeCount> -> => 1> > height> +> => 1> > > return> height> > # Driver Code> root> => Node(> 1> )> root.left> => Node(> 2> )> root.right> => Node(> 3> )> root.left.left> => Node(> 4> )> root.left.right> => Node(> 5> )> > print> (> 'Height(Depth) of tree is'> , height(root))>

C#

using> System;> using> System.Collections.Generic;> class> GFG {> > // A Tree node> > class> Node {> > public> int> key;> > public> Node left, right;> > public> Node(> int> key)> > {> > this> .key=key;> > this> .left=> this> .right=> null> ;> > }> > }> > // Utility function to create a new node> > /*Node newNode(int key)> > {> > Node* temp = new Node;> > temp.key = key;> > temp.left = temp.right = NULL;> > return (temp);> > }*/> > /*Function to find the height(depth) of the tree*/> > static> int> height(Node root)> > {> > // Initialising a variable to count the> > // height of tree> > Queue q=> new> Queue();> > q.Enqueue(root);> > int> height = 0;> > while> (q.Count>0) {> > int> size = q.Count;> > for> (> int> i = 0; i Node temp = q.Peek(); q.Dequeue(); if (temp.left != null) { q.Enqueue(temp.left); } if (temp.right != null) { q.Enqueue(temp.right); } } height++; } return height; } // Driver program public static void Main() { // Let us create Binary Tree shown in above example 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); Console.Write('Height(Depth) of tree is: ' + height(root)); } } // This code is contributed by poojaagarwal2.>

Javascript

// JavaScript program for above approach> // a tree node> class Node{> > constructor(key){> > this> .key = key;> > this> .left => this> .right => null> ;> > }> }> // utility function to create a new node> function> newNode(key){> > return> new> Node(key);> }> // function to find the height of the tree> function> height(root){> > // initialising a variable to count the> > // height of tree> > let q = [];> > q.push(root);> > let height = 0;> > while> (q.length>0){> > let size = q.length;> > for> (let i = 0; i let temp = q.shift(); if(temp.left != null){ q.push(temp.left); } if(temp.right != null){ q.push(temp.right); } } height++; } return height; } // driver code let root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); document.write('Height(Depth) of tree is: ' + height(root)); // this code is contributed by Kirti Agarwal(kirtiagarwal23121999)>

Produzione
Height(Depth) of tree is: 3 

Complessità temporale: SU)
Spazio ausiliario: SU)