Poiščite največjo globino ali višino danega binarnega drevesa

Poiščite največjo globino ali višino danega binarnega drevesa

Za podano binarno drevo je naloga najti višino drevesa. Višina drevesa je število oglišč v drevesu od korena do najglobljega vozlišča.

Opomba: Višina praznega drevesa je 0 in višina drevesa z enim vozliščem je 1 .

Primer binarnega drevesa

Primer binarnega drevesa

Priporočena praksa Višina binarnega drevesa Poskusite!

Rekurzivno izračunajte višino levo in prav poddrevesa vozlišča in vozlišču dodeli višino kot max višine dveh otrok plus 1 . Za podrobnosti glejte spodnjo psevdo kodo in program.

Ilustracija:

Razmislite o naslednjem drevesu:

Primer drevesa

Primer drevesa

maxDepth('1') = max(maxDepth('2'), maxDepth('3')) + 1 = 2 + 1

ker rekurzivno
maxDepth('2') = max (maxDepth('4'), maxDepth('5')) + 1 = 1 + 1 in (ker je višina tako '4' kot '5' enaka 1)
maxDepth('3') = 1

Za uresničitev ideje sledite spodnjim korakom:

  • Rekurzivno izvedite iskanje najprej v globino.
  • Če je drevo prazno, vrnite 0
  • V nasprotnem primeru naredite naslednje
    • Pridobite največjo globino levega poddrevesa rekurzivno, tj. pokličite maxDepth(tree->left-subtree)
    • Pridobite največjo globino desnega poddrevesa rekurzivno, tj. pokličite maxDepth(tree->right-subtree)
    • Pridobite največjo največjo globino levo in prav poddrevesa in dodajte 1 nanj za trenutno vozlišče.
      • max_depth = max (največja globina levega poddrevesa, največja globina desnega poddrevesa) + 1
  • Vrni max_depth.

Spodaj je izvedba zgornjega pristopa:

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->levo);> > int> rDepth = maxDepth(node->desno);> > /* use the larger one */> > if> (lDepth>rGlobina)> > 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->podatki = podatki;> > Node->levo = NULL;> > Node->desno = NULL;> > return> (Node);> }> // Driver code> int> main()> {> > node* root = newNode(1);> > root->levo = novoVozlišče(2);> > root->desno = novoVozlišče(3);> > root->levo->levo = novoVozlišče(4);> > root->levo->desno = novoVozlišče(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->levo);> > int> rDepth = maxDepth(node->desno);> > /* use the larger one */> > if> (lDepth>rGlobina)> > 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->podatki = podatki;> > node->levo = NULL;> > node->desno = NULL;> > return> (node);> }> int> main()> {> > struct> node* root = newNode(1);> > root->levo = novoVozlišče(2);> > root->desno = novoVozlišče(3);> > root->levo->levo = novoVozlišče(4);> > root->levo->desno = novoVozlišče(5);> > printf> (> 'Height of tree is %d'> , maxDepth(root));> > getchar> ();> > return> 0;> }>

Java

// 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>rGlobina)> > 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>rGlobina):> > 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>rGlobina)> > 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>rGlobina)> > 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> >

Izhod
Height of tree is 3 

Časovna zapletenost: O(N) (Oglejte si objavo na Prehod drevesa za podrobnosti)
Pomožni prostor: O(N) zaradi rekurzivnega sklada.

Poiščite največjo globino ali višino drevesa z uporabo Level Order Traversal :

naredi Level Order Traversal , medtem ko dodajate vozlišča na vsaki ravni v Za uresničitev ideje sledite spodnjim korakom:

  • Prečkajte drevo v vrstnem redu prečkanja, začenši od korenina .
    • Inicializirajte prazno čakalno vrsto Q , spremenljivka globina in potisnite korenina , nato pritisnite nič v Q .
    • Zaženite zanko medtem do Q ni prazen.
      • Shranite sprednji element Q in izskoči sprednji element.
      • Če sprednji del Q je NIČ nato povečaj globina za eno in če čakalna vrsta ni prazna, potem pritisnite NIČ v Q .
      • Sicer, če element ni NIČ nato preverite njegovo levo in prav otroci in če niso NIČ potisnite jih v Q .
  • Vrnitev globina .

Spodaj je izvedba zgornjega pristopa:

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->ključ = ključ;> > temp->levo = temp->desno = 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->levo) {> > q.push(temp->levo);> > }> > if> (temp->desno) {> > q.push(temp->desno);> > }> > }> > // 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->levo = novoVozlišče(2);> > root->desno = novoVozlišče(3);> > root->levo->levo = novoVozlišče(4);> > root->levo->desno = novoVozlišče(5);> > cout < <> 'Height(Depth) of tree is: '> < < height(root);> }>

Java

// 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> >

Izhod
Height(Depth) of tree is: 3 

Časovna zapletenost: O(N)
Pomožni prostor: O(N)

Druga metoda za iskanje višine Level Order Traversal :

Ta metoda uporablja tudi koncept Level Order Traversal, vendar v čakalno vrsto ne bomo dodajali nič. Preprosto povečajte števec ko se raven poveča in potisne otroke trenutnega vozlišča v čakalno vrsto, nato odstrani vsa vozlišča iz čakalne vrste trenutne ravni.

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->ključ = ključ;> > temp->levo = temp->desno = 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->levo != NULL) { q.push(temp->left); } if (temp->right != NULL) { q.push(temp->right); } } višina++; } vrni višino; } // Program gonilnika int main() { // Ustvarimo binarno drevo, prikazano v zgornjem primeru Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); koren->levo->desno = novoVozlišče(5); cout < < 'Height(Depth) of tree is: ' < < height(root); } // This code is contributed by Abhijeet Kumar(abhijeet19403)>

Java

// 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)>

Izhod
Height(Depth) of tree is: 3 

Časovna zapletenost: O(N)
Pomožni prostor: O(N)